Program massiv4;
Const n= 10;
Var
А : Array [l..n] of Real = (5.4, 5.6, 5.3, 5.8, 5.4, 5.5, 5.5, 5.6, 5.0, 5.7);
i: integer;
min, max, sum: Real;
BEGIN
min : = a[l];
max : = a[l];
sum: = a[l];
for i: = 2 to n do
begin
sum : = sum + a[i];
if a[i] > max Then max : = a[i];
if a[i] < min Then min : = a[i];
end;
WriteLn('Оценка в зачет:', (sum - max - min)/(n - 2) : 2 : 2);
ReadLn;
END.
Рассмотрим прямоугольные таблицы, состоящие из чисел и содержащие произвольное число m строк и произвольное число n столбцов. В математике их называют матрицами, а числа, входящие в состав матрицы - ее элементами. Если число строк матрицы совпадает с числом ее столбцов, то матрица называется квадратной.
В программировании матрицей называется переменная-массив, компоненты которой опять же массивы. Общий вид задания типа, определяющего двумерный массив, такой же, что и в случае, определяющем одномерный массив.
В общем виде описание двумерного массива выглядит так:
имя массива: array [НижняяГраницаИндекса1..ВерхняяГраницаИндекса1, НижняяГраницаИндекса2..ВерхняяГраницаИндекса2} of Тип;
Здесь НижняяГраницаИндекса1, ВерхняяГранщаИндекса1, НижняяГранща-Индекса2, ВерхняяГраницаИндекса2 - целые константы, определяющие диапазоны изменения индексов и, следовательно, число элементов массива, а тип - тип элементов массива.
Например, зададим массив следующим образом:
Var
M: Array [1..168,1..9] of Byte;
{задает двумерный массив, т. е. прямоугольную таблицу, состоящую из 168 строк и 9
столбцов}
Этот же массив можно задать иначе, непосредственно при описании полной переменной:
Var
M: Array [1..168] of Array [1..9] of Byte;
Можно задать описание массива так:
Туре
Vector = Array [1..9] of Byte;
Var
M: Array [1..168] of Vector;
Во всех трех случаях массив описан верно. В двумерном массиве доступ к любому из элементов осуществляется по двум индексам: номеру строки и номеру столбца, например:
M[100],[7] или M[100, 7] - это элемент, находящийся на пересечении сотой строки и седьмого столбца.
Число элементов массива равно произведению числа строк m на число столбцов n. Следовательно, массив M содержит 168*9 = 1512 элементов.
Двумерный массив хорошо иллюстрирует различие между физическим и логическим представлением данных. Он представляет собой логическую структуру данных, которая удобна для программирования и решения задач. Двумерный массив может оказаться полезным при описании объекта, который является двумерным физически (например, шахматная доска или карта). Его используют также при организации набора значений или при вычислениях, зависящих от двух параметров, например вычислении значений двойных сумм.
В языке Паскаль допускается работа с массивами, размерность которых больше двух. Трехмерный действительный массив может быть объявлен следующим образом:
Var А : Array [1..3, 1..4, 1..5] of Real;
Элементы в таком массиве адресуются тремя индексами. Первый индекс задает номер матрицы, второй - номер строки и третий - номер столбца. Такой массив полезен, если некоторое значение определяется тремя параметрами. Например, массив температур может быть проиндексирован по широте, долготе и высоте. При выходе за третье измерение геометрическая аналогия по очевидным причинам невозможна. Количество измерений формально не ограничено.
Многомерные массивы, как и одномерные, можно задавать одним из способов ввода данных в программу. Значения элементов двумерных массивов выводят на экран и вводят с клавиатуры, как правило, по строкам, т. е. сначала все элементы первой строки, затем второй и т. д. Это удобно выполнять при помощи вложенных инструкций for.
Например, требуется ввести в матрицу P размером 3 строки, 4 столбца следующие значения: 1-я строка -1, 1,1,1; 2-я строка - 2, 2, 2, 2; 3-я строка - 3,3,3,3, затем умножить на 3 каждый элемент массива и получить результат на мониторе распечатанным по строкам.
Program massiv5;
Uses Crt;
var
P: array[1..3, 1..4] of Integer;
i,j : Integer;
Begin
ClrScr;
For i: = 1 To 3 Do
begin
WriteLn ('Введи строку ', i);
For j :=1 To 4 Do
Read(P[i,j]);
end;
For i:=1 To 3 Do
begin
For j:=1 To 4 Do
Write (P[i,j]*3);
WriteLn;
end;
ReadKey;
End.
Здесь каждый раз, когда внутренний цикл завершается, внешний цикл увеличивает i на единицу и внутренний цикл выполняется вновь. Таким образом, сначала вводятся, а потом выводятся все компоненты массива по строкам. При выводе мы умножаем каждый элемент массива на 3.
При описании массивов в программе удобно использовать именованные константы как значения верхних границ индексов массива. При задании массива как сложной константы в блоке Const (или в блоках, если их несколько) в круглых скобках перечисляются элементы-массивы, состоящие из элементов-скаляров. Для двумерного массива это может выглядеть так:
Const
a: Array [1..2, 1..5] of Integer = ((-1, 23, 0, 7, 6), (2, 0, -12, 6, 4));
Трехмерный массив можно задать аналогично или следующим образом:
Туре
Cube = Array [0..1, 0..1, 0..1] of Integer;
Const
M : Cube = (((0, 1), (2, 3)), ((4, 5), (6, 7)));
Элементы трехмерного массива будут хранить после этого следующие значения:
М[0, 0, 0] = 0; М[0, 0, 1] = 1; М[0, 1, 0] = 2; М[0, 1, 1] = 3;
М[1, 0, 0] = 4; М[1, 0, 1] = 5; М[1, 1, 0] = 6; М[1, 1, 1] = 7.
В стандартной матричной задаче может потребоваться:
- получить новую матрицу (ввести матрицу) по заданному правилу;
- найти какую-либо величину, используя элементы данной матрицы;
- преобразовать матрицу требуемым образом;
- определить, обладает ли матрица (ее один или несколько элементов, строка, столбец) указанным свойством;
- выполнить ту или иную операцию над матрицей (матрицами).
Следующая задача иллюстрирует использование вложенных циклов при вычислении
двойных
сумм
Program massiv6;
Uses Crt;
var
sum: real;
i,j:1..100;
Begin
ClrScr;
sum: = 0;
Textcolor (LightRed);
For i: = 1 To 100 Do
For j : = 1 To 50 Do
sum : = sum + 1/ (i + sqr (j));
WriteLn (' Сумма равна ', sum);
ReadKey;
End.
1. В массиве а каждый элемент равен 0 или 1. Заменить все нули единицами и наоборот.
2. В массиве каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все 0, затем все 1 и, наконец, все 2. Дополнительного массива не заводить.
3. Даны два n-элементных массива х и у одного типа. Обменять местами все хi и yi (i = 1,..., n), не используя промежуточные величины.
4. Составить алгоритм, который строит последовательность из 10 случайных чисел, запоминает ее и выводит на экран.
5. При предоставлении работнику ежегодно оплачиваемого отпуска в n трудовых дней ему начисляются отпускные следующим образом: вычисляется средняя зарплата за последние 12 месяцев, которая делится на 25,4 и умножается на n. Построить алгоритм, запрашивающий необходимые данные и печатающий размер выплаты для n=12, n=24, n=36.
6. В целочисленной таблице размером в 7 строк и 7 столбцов найти:
- число нулевых элементов, расположенных в нечетных строках;
- число элементов, равных (-1), расположенных в четных строках.
7. В одномерном массиве заменить все элементы с нулевыми значениями на единицу.
8. Имеются данные о ценах на десять видов товаров. Определить номер самого дорогого товара, который намерен приобрести покупатель, имеющий заданную сумму денег.
9. Просуммировать элементы строк матрицы размером 4*3. Результат получить в одномерном массиве размером 4.
10. Заполнить массив А[1..10] случайными числами, вывести на печать содержимое элементов массива с нечетными индексами.
11. В таблицу занесена последовательность из 10 чисел, взятых в промежутке от -5 до5. Найти:
- наименьший член последовательности;
- наименьший из положительных членов;
- наибольшее из всевозможных попарных произведений.
12. Составить программу вывода на экран дисплея элементов матрицы X [1 : 3, 1 : 4], сумма индексов которой равна заданной константе К.
13. Дана матрица Y [1 : 3, 1 : 4]. Найти отношение суммы положительных элементов матрицы к общему числу ненулевых элементов.
1. Что такое массив?
2. Что такое идентификатор массива?
3. Что такое переменная с индексом?
4. Какие значения принимает индекс у переменных массива на языке Паскаль?
5. Верно ли, что массив - это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип?
6. Какие типы данных недопустимы для компонентов массива?
7. Где и как определяется общее число элементов массива?
8. Можно ли размерность массива определить с помощью типа диапазонов?
9. Дайте определение индекса. Какие типы данных можно использовать при описании индекса?
10. Может ли левая граница индексов массива быть меньше правой?
11. Может ли левая граница индексов массива быть положительной?
12. Может ли левая граница индексов массива быть равной нулю?
13. Может ли левая граница индексов массива быть отрицательной?
14. Как осуществляется доступ к каждому элементу массива?
15. Верно ли, что могут существовать массивы массивов?
16. Верно ли, что элементами массива могут быть данные любого типа, включая структурированные?
17. Может ли индекс быть выражением целого типа?
18. Может ли индекс быть выражением вещественного типа?
19. Может ли индекс быть выражением любого порядкового типа?
20. Какой массив называется одномерным?
21. Какой массив называется двумерным?
22. Какой массив называется п-мерным?
23. Верно ли, что одномерный массив соответствует понятию линейной таблицы (вектора)?
24. Верно ли, что двумерный массив соответствует понятию прямоугольной таблицы (матрице, набору векторов)?
25. Существуют ли ограничения на размерность массива?
26. Можно ли в описании массива использовать предварительно определенные константы?
27. В какой последовательности располагаются в памяти элементы одномерного массива?
28. Верно ли, что двумерные массивы располагаются в памяти таким образом, что второй индекс изменяется быстрее, чем первый?
29. Верно ли, что матрица расположена в памяти по строкам?
30. Может ли процедура read(x) ввести весь массив х целиком?
31. Можно ли с помощью стандартной процедуры write(x) вывести весь массив х целиком?
32. Как можно сымитировать работу с массивом переменной длины?