Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика программирование, учебник.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
22.08 Mб
Скачать

5 Одномерные числовые массивы

Рассматриваемые до сих пор типы данных были простыми типами.

Простой тип – это такой тип данных, данные которого могут представлять только по одному значению, например, переменная целого типа может хранить только одно целое число.

Язык PASCAL, наряду с простыми типами данных, содержит еще и стуктурированные типы данных, элементы которых могут представлять совокупность значений.

Наиболее часто используемый структурированный тип данных – это массив. Под массивом понимается упорядоченная конечная совокупность данных одного типа, рассматриваемая как единое целое. К необходимости использования массивов приходят всякий раз, когда требуется связать и использовать целый ряд родственных величин, например, результаты замеров температуры воздуха в течение некоторого периода удобно рассматривать как совокупность вещественных чисел, объединенных в один сложный объект – массив измерений.

Каждый массив имеет имя (идентификатор). Доступ к элементу массива в программе осуществляется с помощью индекса – целого числа, служащего своебразным номером элемента в массиве. Индекс элемента заключается в квадратные скобки. При упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс элемента в квадратных скобках.

T0

5.1

6.3

7.1

6.2

5.0

TEMP

TEMP[1]

TEMP[2]

TEMP[3]

TEMP[4]

TEMP[5]

Число элементов массива определяется при его описании, и в дальнейшем не меняется. Массив описывается при помощи задания типа его компонент, типа индексов и границ изменения индексов.

Тип индекса обычно целый ограниченный.

Тип компонента может быть любым: целым вещественным, символьным, и даже массивом. Тип компонент массива – это просто тип данных, ассоциированный с каждым элементом массива. Например, если массив имеет вешественный тип, то каждый его элемент может быть использован как вешественная переменная.

Если в программе используется массив, то он должен быть описан в разделе описания переменных VAR по следующей структуре:

VAR <ИмяМассива>:ARRAY[<НачЗначИндекса>..<КонЗначИндекса>] OF <ТипЭлементов>;

При описании массива определяются границы изменения его индексов. Если в программе делается попытка обратиться к элементу массива с несуществующим индексом, то возникает ошибка исполнения.

Пример описания массива:

VAR RESULT:ARRAY[1..10] OF REAL;

Здесь описывается вешественный массив RESULT из 10 элементов.

Если несколько массивов имеют одинаковое описание, то при описании их можно объединить в список.

VAR A,B,C:ARRAY[1..5] OF INTEGER;

Если два массива имеют одинаковое описание, то их можно проверить на равенство или неравенство с помощью одной операции сравнения, не детализируя ее до поэлементного сравнения. При этом следует учитывать, что в операциях сравнения можно использовать только операции «=» или «!=», другие операции сравнения требуют поэлементного сравнения.

При обращении к элементу массива в качестве индекса может стоять выражение, частным случаем которого являются константа или переменная.

Элемент массива называется индексированной переменной, в отличие от него, переменная без индекса называется простой переменной.

Элементы массива могут стоять как в левой, так и в правой частях оператора присваивания. Над элементами массива можно производить те же операции, которые допустимы для данных его базового типа, т.е. если его базовый тип – вещественный, то для такого элемента допустимы все операции, выполняемые над вещественными данными, включая и стандартные функции. Например:

B[5]:=B[3]+1;

SUM:=SUM+A[K];

P1:=A[2*K+3];

P2:=SIN(A[1]);

Для ввода и вывода числовых значений массива надо использовать арифметический цикл, где целая переменная I используется с одной стороны как параметр цикла, а с другой стороны – в качестве индекса.

PROGRAM MASSIV;

VAR A:ARRAY [1..5] OF REAL;

B:ARRAY [1..6] OF REAL;

I:INTEGER;

BEGIN

FOR I:=1 TO 5 DO

BEGIN

WRITE(‘ENTER A[’,I,’]=’);

READLN(A[I]);

END;

FOR I:=1 TO 6 DO WRITELN(‘B[’,I,’]=’,B[I]:10:4);

END.

Актуальной является задача поиска наибольшего и наименьшего элемента массива. Для ее решения вводятся вспомогательные переменные, хранящие текущие максимальное (amax) и минимальное (amin) значения, а также переменные, хранящие их номера (nmax и nmin). Первоначально за текущий минимальный и максимальный элемент принимается первый элемент массива, а затем организуется цикл перебора элементов массива, начиная со второго, и до конца. В цикле производится срвнение текущего элемента массива с текущим минимальным и текущим максимальным элементами. Если текущий элемент массива меньше текущего минимального элемента, то текущий минимальный элемент принимается равным текущему элементу, и, аналогично, если текущий элемент массива больше текущего максимального элемента, то текущий максимальный элемент принимается равным текущему элементу.

Рассмотрим процесс поиска наибольшего и наименьшего элемента массива на примере массива из 10-ти элементов.

a

5

7

4

10

3

9

2

6

1

8

amin

5

5

4

4

3

3

2

2

1

1

nmin

1

1

3

3

5

5

7

7

9

9

amax

5

7

7

10

10

10

10

10

10

10

nmax

1

2

2

4

4

4

4

4

4

4

В результате работы этого алгоритма получаем наибольший элемент массива – это 10, стоящий на 4-м месте, а наименьший элемент – это 1, стоящий на 9-м месте. Блок-схема алгоритма решения задачи приведена на рис. 2.13.

PROGRAM MINMAX;

VAR I, NMIN, NMAX: INTEGER;

AMIN, AMAX: REAL;

A: ARRAY[1..10] OF REAL;

BEGIN

FOR I:=1 TO 10 DO

BEGIN

WRITE(‘ENTER A[’, I,’’);

READLN(A[I]);

END;

WRITELN(‘INITIAL ARRAY’);

FOR I:=1 TO 10 DO WRITE(A[I]:6:2,’ ’);

WRITELN;

NMIN:=1;AMIN:=A[1];

NMAX:=1;AMAX:=A[1];

FOR I:=2 TO 10 DO

BEGIN

IF A[I]>AMAX THEN BEGIN AMAX:=A[I]; NMAX:=I; END;

IF A[I]<AMIN THEN BEGIN AMIN:=A[I]; NMIN:=I; END;

END;

WRITELN(‘MAX=’,AMAX, ‘ NMAX=’,NMAX);

WRITELN(‘MIN=’,AMIN, ‘ NMIN=’,NMIN);

END.

Часто требуется упорядочить массив по убыванию или возрастанию его элементов, для этого используют алгоритмы сортировки элементов массива. Наиболее известным среди них является алгоритм «пузырька», блок-схема которого приведена на рис. 2.14. В этом алгоритме используется аналогия с пузырьками воздуха, всплывающими вверх в стакане с газированной водой. Только в этом случае, при упорядочивании по возрастанию, наименьший элемент перемещается вверх к началу массива, затем перемещается вверх элемент, наименьший из оставшихся, и т.д. Для перемещения вверх элементов, два соседних элемента массива сравнивают друг с другом, и если имеется инверсия (следующий элемент меньше предыдущего), то тогда они меняются местами.

5

5

5

5

5

5

5

5

1

1

1

1

1

1

1

1

1

1

1

1

7

7

7

7

7

7

7

1

5

5

5

5

5

5

2

2

2

2

2

2

4

4

4

4

4

4

1

7

7

7

7

7

7

2

5

5

5

5

5

3

10

10

10

10

10

1

4

4

4

4

4

4

2

7

7

7

7

7

3

5

3

3

3

3

1

10

10

10

10

10

10

2

4

4

4

4

4

3

7

7

9

9

9

1

3

3

3

3

3

3

2

10

10

10

10

10

3

4

4

4

2

2

1

9

9

9

9

9

9

2

3

3

3

3

3

3

10

10

10

10

6

1

2

2

2

2

2

2

2

9

9

9

9

9

9

6

6

6

6

6

1

6

6

6

6

6

6

6

6

6

6

6

6

6

6

9

9

9

9

9

8

8

8

8

8

8

8

8

8

8

8

8

8

8

8

8

8

8

8

8

1

1

1

1

1

1

1

2

2

2

2

2

2

2

3

3

3

3

3

3

3

5

5

5

4

4

4

4

7

7

4

5

5

5

5

4

4

7

7

7

6

6

10

6

6

6

6

7

7

6

10

10

10

8

8

8

8

8

8

8

10

10

9

9

9

9

9

9

9

10

В таблице приведен процесс сортировки массива методом пузырька на примере массива из десяти элементов. Жирным шрифтом выделены меняющиеся местами элементы.

PROGRAM BUBBLE;

VAR X:REAL;

I,J:INTEGER;

A:ARRAY[1..10] OF REAL;

BEGIN

FOR I:=1 TO 10 DO

BEGIN

WRITE(‘ENTER A[’,I,’]=’);

READLN(A[I]);

END;

WRITELN(‘INITIAL ARRAY’);

FOR I:=1 TO 10 DO WRITE(A[I]:6:2,’ ’);

WRITELN;

FOR I:=2 TO 10 DO

FOR J:=10 DOWNTO I DO

BEGIN

IF A[J-1]>A[J] THEN BEGIN

X:=A[J];

A[J]:=A[J-1];

A[J-1]:=X;

END;

END;

WRITELN(‘SORTED ARRAY’);

FOR I:=1 TO 10 DO WRITE(A[I]:6:2,’ ‘);

WRITELN;

END.

Для примера рассмотрим решение следующей задачи. Дан массив из десяти вещественных чисел. Найти среднее арифметическое положительных элементов этого массива.

Решение этой задачи распадается на следующие этапы:

  • ввод исходного массива;

  • контрольный вывод исходного массива;

  • перебор элементов массива с подсчетом суммы и числа положительных элементов;

  • вычисление среднего арифметического положительных элементов;

  • вывод полученных результатов.

PROGRAM VECTOR;

VAR A: ARRAY [1..10] OF REAL;

I,K: INTEGER;

S,SRAR: REAL;

BEGIN

{ввод исходного массива}

FOR I:=1 TO 10 DO

BEGIN

WRITE(‘ENTER A[’,I,’]=’);

READLN(A[I]);

END;

{контрольный вывод введенного массива}

WRITELN(‘INITIAL ARRAY’);

FOR I:=1 TO 10 DO WRITE(A[I]:6:2,’ ’);

WRITELN;

{подсчет числа и суммы положительных элементов}

S:=0; K:=0;

FOR I:=1 TO 10 DO

BEGIN

IF A[I]>0 THEN BEGIN

S:=S+A[I];

K:=K+1;

END;

END;

{вывод результатов}

IF K>0 THEN BEGIN

SRAR:=S/K;

WRITELN(‘AVERAGE=’,SRAR:10:4);

END

ELSE WRITELN(‘NO POSITIVE ELEMENTS’);

END.