Основы алгоритмизации и программирования на языке Паскаль
..pdfВсе элементы массива имеют одно и то же имя, имя самого массива (А, В, Spisok) с различными целочислен ными индексами, изменяющимися по порядку.
Количество индексов определяет размерность массива. Например, одномерный, двухмерный и так далее массивы.
Индексы определяют положение элемента в массиве, т.е. позволяют получить доступ в произвольный момент времени к любому элементу массива как к простой пере менной.
В одномерном массиве элементы располагаются строго
последовательно, например компоненты вектора В. Двух мерный массив визуально представляется плоской табли цей или с точки зрения математики - матрицей. И каждый элемент двухмерного массива определяется значениями двух индексов, указывающих номер строки и номер столб ца, на пересечении которых находится этот элемент.
Например: а[1], afkj, b[2,3], b[i,j], Spisok [5].
Вотличие от простых переменных, рассматриваемых ранее, элементы массива называются индексированными переменными.
Впамяти ЭВМ элементы массива хранятся «по сосед ству», т.е. располагаются в последовательно расположен ных ячейках. Например:
Для одномерного массива
7.4. Одномерный массив
Рассмотрим многочлен
Р(х) = lx s —1,3л:4 + 5л:3 —6,8л:2 + х —1,5,
который однозначно определяется совокупностью из ше сти чисел - его коэффициентов: А{1\ -1,3; 5; -6,8; 1; -1,5}. Эту совокупность чисел можно рассматривать как одно мерный массив с именем А из шести элементов типа real:
А[1] = 7,Л[2] =-1,3,.... ,Л [6 ]= - 1,5.
Элементы массива, как и любые простые переменные, должны быть описаны.
Существует два способа описания массивов:
-явное описание в разделе описаний Var;
-неявное описание в разделе описания Туре.
При описании массивов указывается:
-имя массива;
-размерность массива;
-диапазоны изменения всех индексов. Тем са мым задается общее число элементов массива (т.е. размер массива);
-тип элементов массива.
Формат явного описания массива:
Var <имя массива>: Array [<тип индекса>] o f <тип элементов массива>;
где Array, o f- зарезервированные слова (массив, из). Например: Var А : Array [1 .. 6] o f real;
Здесь объявлен одномерный массив вещественных чи сел из шести элементов: А[1],...., А[6].
Формат неявного описания массива:
Type Mass =Array [L.50] o f real; Var A, C: Mass;
Здесь объявлен новый тип данных с именем Mass из 50 элементов вещественного типа
Затем этот тип используется для описания двух одно мерных массивов: А[1],....,А[50] и С[1],....,С[50].
Массивы, границы которых явно заданы в разделе опи сания, называются статическими. Их размер известен заранее и не меняется в процессе работы программы.
Массивы, размеры которых могут меняться во время выполнения программы, называются динамическими. В некоторых случаях это весьма удобно, так как позволяет экономно расходовать память ЭВМ, захватывая ее по мере необходимости. В нашем курсе мы не рассматриваем такие массивы.
Использование индексированных переменных в любых операторах ничем не отличается от использования перемен ных базового типа. В качестве индекса можно использовать:
- |
константу |
2?[5]:=2?[1]+1.5; |
- |
переменную |
Sum:=Sum+C[k\; |
- |
выражение |
А [2*7+1] :=Р1; |
7.5. Ввод и вывод числовых значений массива
Паскаль не имеет средств ввода-вывода элементов массива сразу, поэтому ввод и вывод значений произво дится поэлементно. Инициализацию массива (присваива ние начальных значений) можно организовать с помощью оператора присваивания. Однако чаще всего они вводятся
с клавиатуры с помощью оператора Read с использованием счетного оператора цикла For.
Рассмотрим несколько фрагментов программ инициа лизации массива.
Пример 7.1. Организовать ввод 10 элементов массива Л с клавиатуры.
Первый вариант |
Второй вариант: |
For i:=l to 10 do |
For i:=l to 10 do |
ReadLn(A[iJ); |
Begin |
|
Write(‘Beedu’, i:2, ‘-й элемента’); |
|
ReadLn(A[iJ); |
|
End; |
Пример 7.2. Сформировать последовательность чисел I2,2 2, З2, ...п1 и оформить ее в виде одномерного массива.
For i:=l to 10 do A[i]:=i*i;
Пример 7.3. Сформировать (сгенерировать) одномер ный массив случайных чисел.
Используем стандартную функцию Random(x), кото рая возвращает случайное число (целое) из диапазона от 0 до X. Эта же функция без аргумента, Random, генерирует случайное число из диапазона от 0 до 1.
Функция Randomize обеспечивает несовпадение слу чайных чисел, генерируемых функцией Random.
Randomize;
For i:=l to 10 do
Begin
AfiJ:=Random(3)+5;
B[iJ:= Random;
End;
В результате выполнения этого фрагмента программы будет создан массив А, который содержит 10 случайных чисел из диапазона от 5 до 7, а массив 5 - 1 0 случайных чисел из диапазона от 0 до 1. Функция Randomize позволя ет получать различные значения элементов массивов при каждом обращении к этому фрагменту программы.
Вывод значений элементов массива выполняется ана логичным образом, но используются операторы Write или
WriteLn.
Пример 7.4. Вывести значения элементов массива на экран.
For к:=1 to 10 do Writeln (С[к]);
Десять значений элементов массива С будут выведены на экран в столбец. При замене оператора Writeln на Write вывод элементов массива будет произведен в строку.
7.6. Действия над элементами массива
Рассмотрим несколько типичных примеров обработки элементов массива.
Пример 7.5. Вычислить сумму (Sum) четных элементов массива XfNJ, введенных с клавиатуры.
Введем обозначения:
N - количество элементов массива;
/ - переменная, выполняющая функции параметра цик ла и одновременно индекса элементов массива.
Для определения четности числа используем операцию целочисленного деления (остаток):
0; число четное;
X[i] mod 2 =
, =£ 0; число нечетное.
Приведем блок-схему и программу для этого примера:
Program Demol; |
|
|
Const N=50; |
|
|
Par X: |
Array[1.. N] o f |
real; |
i: |
integer; |
|
Sum: real; |
|
|
Begin |
|
|
Readln(N); |
|
|
Sum:=0; |
|
|
For i:=l to N do |
|
|
begin |
|
|
|
readln(X[iJ); |
|
|
I f (X[i] mod 2 = 0) |
then Sum:=Sum+XfiJ; |
end; |
|
Writeln(Sum);
End.
В разделе описания констант укажем значение кон станты N = 50, количество элементов массива. Это очень Удобно, так как в случае изменения размера массива не Нужно будет вносить изменения в текст программы, а до статочно только изменить значение этой константы в раз деле описания констант.
Пример 7.6. Вычислить максимальный элемент масси ва Х[п], и=10.
Перед началом поиска максимального элемента допу стим, что его первый элемент и является максимальным. Это запишется так: Мах:=Х[\\. Далее циклически, начиная со второго элемента сравниваем элементы массива с мак симальным элементом. Если очередной элемент массива больше, чем максимальный, то следует считать его значе ние максимальным. Программа запишется следующим об разом:
Program Demo2;
Var X:Array[l.. 10] o freal;
i: integer; |
|
|
|
Begin |
|
|
|
For |
i:=l to |
10 |
do readln(X[i]); {ввод массива} |
Max:=X[l]; |
{1-й элемент - максимальный } |
||
For |
i:=2 to |
10 do |
|
I f |
X[i]>M ax |
then Max:=X[i]; |
Writeln(Max);
End.
В следующих примерах будем записывать лишь фраг менты программ.
Пример 7.7. Подсчитать количество элементов масси ва, имеющих нулевые значения.
Введем переменную к, назовем ее счетчиком и обну лим его. Далее циклически проверяем условие A[i]=0 и, если оно выполняется, добавляем единицу в счетчик.
к:=0; |
{счетчик} |
For i:=l to |
п do |
I f A[i]=0 |
then k:=k+l; |
Пример 7.8. Обменять значения первого и десятого элементов массива AfNJ.
Перестановка значений элементов массива осуществ ляется с помощью дополнительной переменной V.
V:=A[10J;
А[10]:=А[1];
А[1]:=У;
Во всех этих примерах мы рассматривали явное описа ние массивов в разделе Var. В следующем примере рас смотрим неявное описание массива.
Пример 7.9. Сортировка массива. В одномерном мас сиве X[N] произвести перестановку так, чтобы элементы были расположены по возрастанию, т.е.
х1 < х 2 < ••• < хп.
Рассмотрим метод «пузырьков». Идея метода заключа ется в последовательном упорядочении смежных пар эле ментов массива:
Х]_ и х2; Х 2 И Х 3; |
хт_г и хп. |
В итоге максимальный элемент переместится в конец, т.е. в п-ю позицию.
Затем эту процедуру повторяют для (п - 1) элементов, т.е. для элементов х1( х2; х3; ..., хп_г , и наибольший из них помещают в (и - 1)-ю позицию и так далее, вплоть до цепочки из двух элементов: х\ и хг.
Такой алгоритм имеет структуру двух вложенных друг в друга циклов. Причем внутренний цикл является циклом переменной (сокращающейся) длины.
For i:=l to N -l do
For k:=l to N -l do
I f X[k]>X[k+l] then
Begin
A:= X[k]
X[KJ:=X[k+l];
X[k+1J:=A;
End;
Пример 7.10. Используя процедуру, вычислить макси мальный элемент массива из N элементов.
Для описания формальных параметров в заго ловке процедуры используется только вариант неявного описания массива.
Назовем процедуру МахАгг и оформим ее по. аналогии с примером 7.6.
Инициализацию элементов массива произведем введе нием с пульта. Программа имеет вид
Program Demo3;
Type Masiv = Array[1 .. 20] o f integer;
Var MM, n, i : integer;
A:Masiv;
{Подпрограмма - процедура}
Procedure Max_Arr(m: integer; X: Masiv; Var Max: integer);
Var k: |
integer; |
Begin |
|
Max:=X[lJ; |
|
For |
k:=2 to m do |
End; |
I f X[k]>=Max then Max:=X[kJ; |
|
{Основная программа} Begin
WriteС Введите размер массива n=');Readln(n); For i:=l to n do Readln(A[iJ);
Max_Arr (n,A,MM); {вызов процедуры} WritelnCМаксимальный элемент =',MM:3);
End.