Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Основы алгоритмизации и программирования на языке Паскаль

..pdf
Скачиваний:
0
Добавлен:
12.11.2023
Размер:
3.01 Mб
Скачать

Все элементы массива имеют одно и то же имя, имя самого массива (А, В, 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.