Массивы. Описание и использование массивов
При решении практических задач достаточно часто возникает потребность хранения табличных данных. В качестве примеров массивов в математике можно привести векторы, матрицы, таблицы и т.п.
Массив – это группа элементов, названная одним именем. Элементы массива обозначают именем массива, их местоположение в массиве определяется приписываемым к имени массива индексом.
Объявление массива в программе осуществляется с использованием ключевого слова array, используемого следующим образом:
Type
Имя_типа_массива = array [диапазон] of тип_элементов;
Рассмотрим несколько примеров декларации массивов:
Type
Ar = array[1..100] of integer;
Var
A,B,C : Ar;
Декларацию переменных-массивов можно осуществлять непосредственно в разделе переменных:
Var
A,B,C : array[1..100] of integer;
Пример использования отдельных элементов – обращение через оператор присваивания, считывание с клавиатуры, использование в арифметических выражениях. Обратить внимание на принципиальное отличие от обычной переменной — возможность использования косвенной адресации, по номеру (индексу) элемента.
Пример ввода одномерного массива с клавиатуры и последующего вывода его на экран.
const
Nmax = 10;
var
n : integer;
a : array [1..Nmax] of integer;
begin
{Сначала ввод}
for n:=1 to Nmax do
begin
write(‘Введите элемент a[’, n, ‘]: ’);
read(a[n]);
end;
{Теперь вывод}
for n:=1 to Nmax do
writeln(‘Элемент a[’, n, ‘] = ’, a[n]);
end.
В качестве примера работы с массивом рассмотрим задачу расчета среднего арифметического элементов массива:
Const
Nmax = 500; {константа, определяющая максимальный
размер массива}
Var
X : array[1..Nmax] of integer; {массив для хранения целых чисел}
n : integer; {переменная для хранения выбранного пользователем
количества используемых элементов массива}
i : integer; {переменная-параметр цикла}
S : real; {Переменная для хранения
рассчитываемой суммы элементов}
Begin
{Ввод числа элементов n}
write(‘Введите n: ’);
read(n);
{Ввод массива X}
for i:=1 to n do
Begin
write(‘Введите X[’, i, ‘]: ’);
read(X[i]);
end;
{Расчёт среднего арифметического}
S:=0;
For i:=1 to n do
S:=S+X[i];
S:=S/n;
writeln(‘S = ’, S);
End.
Раздел №14 (4 часа)
Процедуры и функции
План:
• Структурный подход к разработке программы. Подпрограммы
• Синтаксис объявления и использования процедур
• Синтаксис объявления и использования функций
• Примеры использования подпрограмм на Паскале
• Параметры-переменные и параметры-значения
14. Процедуры и функции
Структурный подход к разработке программы. Подпрограммы
Рассмотрим следующий пример. Дан треугольник ABC с длинами сторон a, b и c соответственно (рис. 2). Необходимо разработать программу, вычисляющую его площадь.
Рис. 2
Для решения задачи воспользуемся формулой Герона:
,
где – полупериметр:
.
Алгоритм решения будет иметь вид:
Программная реализация этого алгоритма может иметь вид:
Var
a, b, c : real; {Переменные для хранения исходных данных}
S : real; {Переменные для хранения исходных данных}
p : real; {Вспомогательная переменная для хранения полупериметра}
Begin
write(‘Введите a, b и c: ’); read(a, b, c);
p := (a + b + c)/2.0;
S := sqrt(p*(p-a)*(p-b)*(p-c));
write(‘S=’, S:0:3);
end.
Усложним исходное задание. Предположим, что необходимо рассчитать площадь четырёхугольника ABCD, заданного длинами своих сторон a, b, c, d и длиной диагонали e.
Искомая площадь представляет собой сумму площадей соответствующих треугольников
. Поэтому для решения задачи можно также воспользоваться формулой Герона, которую в этом случае придётся применять дважды. Алгоритм решения можно представить следующим образом:
Следует обратить внимание на то, что одна и та же последовательность вычислений: «расчёт полупериметра – расчёт площади», – выполняется в программе дважды, но с различными исходными данными. Первый раз вычисления производятся с использованием длин a, b и e, а во втором – c, d и e.
В принципе по данному алгоритму можно было бы непосредственно написать программу вычислений, продублировав однотипные операторы несколько раз. Однако такой подход имеет ряд принципиальных недостатков:
1. Дублирование операторов увеличивает размер программы, повышает требования к объёму оперативной памяти, необходимой для хранения машинных кодов.
2. Дублирование снижает возможности по сопровождению и модификации программы; например можно представить, что на каком-то этапе разработки программы было принято решение отказаться от использования формулы Герона, и рассчитывать площадь треугольников иным образом. В этом случае программисту пришлось бы тщательно отыскивать все места в программе, где встречается последовательность операторов расчёта площади и менять их на новые фрагменты. При этом нет полной уверенности, что все последовательности были найдены и корректно изменены.
3. Механическое дублирование увеличивает размер исходных текстов программы и усложняет её восприятие программистом.
Для преодоления всех этих проблем в языках высокого уровня предусматривается обычно возможность выделения отдельных фрагментов программы в некоторые самостоятельные блоки – подпрограммы, к которым можно обращаться многократно из основной части программы.