Материал: Методические указания к выполнению лабораторной работы «Сложные типы данных» по дисциплине «Программирование». Литвиненко Ю.В

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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.

1.2. Многомерные массивы

Рассмотрим прямоугольные таблицы, состоящие из чисел и содержащие произвольное число 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.

2. Задание на лабораторную работу

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]. Найти отношение суммы положительных элементов матрицы к общему числу ненулевых элементов.

3. Контрольные вопросы к лабораторной работе

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. Как можно сымитировать работу с массивом переменной длины?

Источник: https://studfile.net/preview/16567778/