Массивы данных
Массивы – упорядоченная структура однотипных данных, хранящихся в памяти последовательно. Массив обязательно имеет размеры. Описывается в разделе TYPE или VAR следующим образом:
Type <имя_типа> = array [диапазон_индексов] of <базовый_тип>;
или
Var <имя_переменной> : array [ диапазон_индексов] of <базовый_тип>;
Отметим, что в разделе Type разделителем служит символ “=”, а в разделе переменных var – двоеточие “ : ” .
П p имер: TYPE
array10 = array [1..10] of integer;
array11 = array [11..22] of real;
VAR
V: array[-3..2] of char; {массив из 6 элементов}.
В качестве индексов можно использовать любые перечислимые типы как встроенные, так и вводимые программистом. Индексы могут задаваться также диапазоном. Если диапазон соответствует всему типу, можно просто указывать имя этого типа.
Например:
TYPE DIAP = 1..100;
VECTOR = array [DIAP] of real;
При записи сложных массивов индексы разных диапазонов могут принадлежать разным типам. Например:
VAR V: array [0..10 , 'A'..'C' ] of real;
В качестве значений диапазона могут использоваться идентификаторы, если их значения определены выше. Например:
CONST
K=10; L=5;
VAR
A: ARRAY [1..K] OF INTEGER;
B,С: ARRAY[1..K,1..L] OF REAL;
Массивы хранятся в памяти как сплошные последовательности компонентов, причем быстрее изменяется дальний правый индекс.
Обращение к элементу массива в программе производится указанием имени массива и индексов, заключенных в квадратные скобки:
<имя> [ <индексы> ].
Пример:
A[1] := 1; B[8,5] := В[8,1] + B[8,2]; V[1,'B'] := 3.5; .
В данном типе определена единственная операция присваивания. Можно присваивать целиком весь массив лишь массиву того же типа и размерности, например: B := С.
Операции сравнения в массивах производятся только поэлементно.
Обнуление одновременно всех элементов массива выполняется в цикле
FOR I :=1 TO K DO A[I] := 0.
Разрешается объявлять массивы, где базовыми элементами служат также массивы, например:
TYPE
VECTOR = array[1..5] of real;
MATRIX = array[1..10] of VECTOR;
что эквивалентно следующему способу описания:
MATRIX = array[1..10] of array[1..5] of real;
или
MATRIX=array[1..10, 1..5] of real;
Типизированные константы-массивы
В качестве типизированных констант можно использовать массивы. В константах-массивах список констант разделяется запятыми и заключается в круглые скобки:
CONST vector : array[0 .. 4] of byte = ( 0, 1, 2, 3, 4 );
массив символов может быть описан следующей записью:
CONST vec : array[-1..2] of char = ( 'a' , 'b' , 'c' , 'd' );
При объявлении многомерных констант-массивов список констант, соответствующих каждому измерению, заключается в дополнительные круглые скобки и отделяется от соседних списков запятыми. Самый внутренний список констант связывается с изменением самого правого индекса массива. Например:
CONST
matr: array[1..2, 1..4] of byte = ((0,1,2,3),(4,5,6,7));
cub: array[0..1, 1..2,1..3] of byte = (((0,1,2),(3,4,5)),
((6,7,8),(9,10,11)));
6.2. Пример и задания для одномерных массивов
Пример. Найти значение и номер наименьшего элемента в одномерном массиве. При задании элементов исходного массива типизированной константой СА решения задачи имеет вид (рис. 12, а) и используется следующая программа:
Program lr6_1;
const
a: array[1..10] of integer = (5,2,7,1,8,3,4,5,6,6);
var
i, min, n: integer;
Begin
min:=a[1];
n:=1;
for i:=2 to 10 do
if a[i]<min then begin
min:=a[i];
n:=i
end;
writeln('минимальный элемент равен ',min, ' n=',n);
End.
Если элементы массива вводятся с клавиатуры, то СА имеет вид (рис. 12, б) и текст программы изменится:
program lr6_2;
var a: array[1..10] of integer;
i, min, n: integer;
begin
read(a[1]);
min:=a[1]; n:=1;
for i:=2 to 10 do begin
read(a[i]);
if a[i]<min then begin
min:=a[i]; n:=i;
end;
end;
writeln('минимальный элемент равен ', min, ' n=',n);
End.
Задания для самостоятельного выполнения
Задание 1
Начертить структурную схему алгоритма, написать и отладить программу для одной из следующих задач. В одной программе исходные массивы задать типизированными константами. В другой программе элементы исходных массивов ввести через оператор ввода.
1. Дан массив из N чисел (N > 8). Вычислить их среднее геометрическое значение.
2. Дан массив из N чисел (N > 10). Найти максимальное значение.
3. Дано 20 чисел. Найти их среднее арифметическое значение.
4. Дано 12 вещественных чисел. Найти порядковый номер того из них, которое наиболее близко к какому-нибудь заданному целому числу Х.
5. Дана последовательность из 15 целых чисел. Определить количество отрицательных чисел в ней и максимальное число подряд следующих отрицательных чисел.
6. Дано 15 целых чисел. Найти наибольшее из них. Определить, сколько из чисел принимает наибольшее значение.
7. Дано целое n > 1 и вещественные числа x1, x2, .., xn. Вычислить математическое ожидание и дисперсию по формулам:
M = , D = .
8. Дан массив из N чисел (N > 10). Вычислить сумму элементов с нечетными индексами и их среднее арифметическое значение.
9. Даны два одномерных массива А и В. Вычислить элементы массива С по правилу: если аi и bi различны, то сi присвоить их сумму, при одинаковых аi, bi в сi переписать соответствующий элемент массива А.
10. Дано 10 вещественных чисел. Вычислить разность между максимальным и минимальным из них.
11. Дано 10 вещественных чисел. Определить, образуют ли они возрастающую последовательность.
12. Дан массив X из n чисел (n >10). Вычислить:
y = x1 - x2 + x3 - ...- xn-1 +xn .
13. Дано 18 чисел. Определить количество элементов, отличное от последнего числа.
14. Дано 12 чисел. Напечатать сначала все отрицательные из них, а затем все остальные.
15. Сформировать одномерный массив из 15 простых чисел.
16. Дано восемь натуральных чисел. Найти их наибольший общий делитель.
17. Дана последовательность натуральных чисел. Вычислить сумму тех из них, порядковые номера (индексы) которых – простые числа.
18. Дан массив из 20 натуральных чисел. Вычислить сумму тех из них, порядковые номера которых - числа Фибоначчи, определяемые формулами
f0 = f1 = 1; fn = fn-1 + fn-2 при n = 1, 2, 3, ... .
19. Дан массив X из n чисел. Вычислить:
y = xn(xn+xn-1)(xn + xn-1 + xn-2)...(xn + ... + x1) .
20. Дано 24 целых числа. Распечатать их в обратном порядке по шесть чисел в строке.
Задание 2
Модифицировать программу_3_2 для функций F1(x) и F2 (x) таким образом, чтобы результаты были сформированы в виде трех одномерных массивов. Выполнить ее и сравнить результаты с полученными в программах_5_1_и_3_2.
Ограниченный тип (диапазон)
Через диапазон можно определить тип, который будет содержать значения только из ограниченного поддиапазона некоторого базового типа. Базовым типом может быть любой целочисленный тип, тип CHAR или любой из введенных программистом перечислимых типов. Определяется тип-диапазон в разделе TYPE указанием имени типа и границ диапазона, разделенных двумя точками:
TYPE <ИмяДиапазона> = < НачальноеЗначение> . . <КонечноеЗначение>;
Начальное значение при определении такого типа не должно быть больше конечного.
Пример: TYPE
TEST1 = (test1, test2, . . . ,test5 );
H= 1.. 20; {поддиапазон для типа Integer}
LETERS = 'A' .. 'Я'; {базовый тип Char}
TESTOD = test2 .. test5; {базовый тип TEST1}
Определение переменных для диапазона производится в разделе VAR. Они могут принимать любые значения из указанного диапазона, включая граничные.
При конструировании диапазона в описании типа можно использовать несложные арифметические выражения для вычисления границ. Но при этом надо следить, чтобы запись выражения не начиналась со скобки (скобка - это признак начала перечисления).
Пример:
CONST N = 30;
TYPE date = 1..31;
kv2 = 3*N+1..6*N;
VAR L, L1: date;
k: kv2;
BEGIN
L:=2*10+5; ...
L1:=2*10+60; {неверно, т.к. L1 выходит за пределы диапазона}
END.
Применение ограниченных типов усиливает контроль данных при выполнении программы. Значения переменных типа «диапазон» могут выводиться на экран и вводиться с клавиатуры только в том случае, когда диапазон взят из базового стандартного типа.
6.4. Пример и задания для двумерных массивов
Пример. Вычислить суммы элементов в столбцах двумерного числового массива А размером [1..3,1..4].
Текст программы для СА (рис. 13):
Program lr7_1;
CONST a: array[1..3,1..4] of integer =
((1,2,3,4),(1,2,3,4),(1,2,3,4));
VAR
i, j: integer;
s: array[1..4] of integer; {массив сумм}
BEGIN
for j := 1 to 4 do
begin
s[j] := 0;
for I := 1 to 3 do
s[j] := s[j] + a[i,j];
write(' s[' , j, ']=' , s[j])
end
END .
Задания для самостоятельного выполнения
Задание 1
1. Даны матрицы A,B: array [1..4,1..4] of real. Вычислить матрицу С поэлементным сложением соответствующих элементов матриц А и В.
2. Дана матрица B: array [1..5,1..5] of real. Найти для нее транспонированную.
3. Даны матрица A: array[1..4,1..4], содержащая вещественные числа, и константа k. Вычислить матрицу С = k*А .
4. Сформировать массив по правилу 1 0 0 ... 0
2 1 0 ... 0
3 2 1 ... 0
...
10 9 8 ... 1
5. Даны натуральное N и элементы аij квадратной вещественной матрицы А пятого порядка. Вычислить N-ю степень каждого элемента этой матрицы по схеме (аij1 = аij, аij2 = аij*аij, аij3 = аij2*аij и т.д., где i, j = 1, 2, ..., 5).
6. Сформировать массив по правилу 0 0 0 ...0
0 1 0 ...0
0 0 2 ...0 .
…
0 0 0 ...9
7. Сформировать массив последовательностью натуральных чисел:
1 2 ... 10
11 12 ... 20
21 22 ... 30 .
...
91 92 ... 100
8. Сформировать двумерный массив: 1 2 3 4 5
5 1 2 3 4
4 5 1 2 3 .
3 4 5 1 2
2 3 4 5 1
9. Дана матрица A: array [1..N,1..N] of integer. Сформировать вектор В из максимальных элементов каждой строки.
10. Дана матрица A: array [1..6,1..6] of integer и переменная x. Элементы нечетных строк матрицы А заменить на значение x.
11. Дана матрица B: array [1..5,1..5]. Получить массив С удалением (либо обнулением) n-й строки и k-го столбца из матрицы В.
12. Определить, является ли заданная квадратная матрица девятого порядка магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах будут одинаковы.
13. Определить, является ли заданная целая квадратная матрица шестого порядка симметричной (относительно главной диагонали).
14. Дана вещественная матрица A: array [1..7,1..4]. Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент оказался в верхнем левом углу.
15. Дана вещественная матрица размером 4х8. Упорядочить ее строки по не- убыванию сумм их элементов.
16. Для заданной целой матрицы размером 6х8 элементов напечатать индексы всех ее седловых точек. Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце.
17. Дана матрица A: array [1..6,1..2] вещественных чисел. Рассматривая A [i,1] и A [i,2] как координаты точек на плоскости, определить радиус наименьшего круга (с центром в начале координат), внутрь которого попадают все эти точки.
18. Дан массив F: array [1..N,1..M] of byte. Определить количество «особых» элементов в нем. Элемент считается «особым», если он больше суммы остальных элементов своего столбца.
19. Дана матрица D: array [1..5,1..6] of integer. Упорядочить элементы строк в нем по убыванию.
20. Дан массив М координат точек на плоскости. Найти наибольшее расстояние между этими точками.
Задание 2
Сформировать таблицу Пифагора для чисел натурального ряда.
Задание 3
Модифицировать программу_3_2 (или 6_3) таким образом, чтобы значения X, F1 и F2 были представлены двумерным массивом, состоящим из трех строк.
Дата: 2019-02-02, просмотров: 311.