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

лабораторная работа / регулярный тип(Массивы) задания

.doc
Скачиваний:
54
Добавлен:
10.02.2014
Размер:
290.82 Кб
Скачать

Описание регулярного типа (массива)

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

Общий вид объявления массивов выглядит так:

<Имя массива> : array[<нижняя граница массива>..<верхняя граница массива>] of <тип данных>;

Имя массива – произвольное имя, выдаваемое вами массиву. Массив по сути своей является такой же переменной, поэтому его можно называть произвольным образом исходя из соображений удобства и наглядности.

Нижняя и верхняя граница массива – это целочисленные значения, определяющие пределы массива. Например, если это соответственно 1 и 6, то массив содержит 6 элементов с индексами 1, 2, 3, 4, 5 и 6. Если это – 2 и 5, то массив содержит 4 элемента с индексами 2, 3, 4 и 5.

Тип данных – тип переменных, составляющих массив.

Например:

var

Numbers : array [1..9] of integer;

Здесь мы задаем массив целочисленного типа, содержащий 9 элементов.

После объявления массива с ним надо каким-то образом работать. Вот как это делается:

<Имя массива>[<индекс>]

Так мы получаем доступ к элементу массива. С отдельным элементом можно делать все то же, что и с обычной переменной:

  1. Присваивать значения: Numbers[2] := 34;

  2. Использовать как операнды в арифметических операциях: Numbers[1] := Numbers[1] = Numbers[2];

  3. Выводить на экран: Wtite(Numbers[4]);

  4. Записывать в них вводимы с клавиатуры значения: Read(Numbers[3]);

  5. Использовать в операциях сравнения: if Numbers[6] > 13 then Write(‘Больше!!!’);

  6. Использовать для задания количества повторений цикла:

For i:=3 to Numbers[5] do

Begin

<тело цикла>

End;

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

Var

Numbers: array[1..10] of integer;

begin

Read(Numbers[1], Numbers[2], Numbers[3], Numbers[4], Numbers[5], Numbers[6], Numbers[7], Numbers[8], Numbers[9], Numbers[10]);

End.

Это очень неудобно и некрасиво. Поэтому следует использовать для этих целей циклы:

Var

Numbers : array[1..10] of integer;

i: integer;

Begin

For i:=1 to 10 do

Read(Numbers[i]);

End.

Алгоритмически это выглядит так:

Как упоминалось выше, массивы бывают различных типов. И это абсолютная правда. Например:

Var

a1: array[1..5] of Boolean;

a2: array[0..6] of char;

a3: array[1..25] of real;

Следует учитывать, что действия, совершаемые над элементами массива, должны соответствовать типу содержащихся в нем данных. То есть, например, не стоит присваивать элементу массива типа integer дробные значения – точно также, как и обычным целочисленным переменным.

Двумерные массивы

Рассмотренные нами ранее массивы являются одномерными. Они содержат линейную последовательность переменных одного типа. Что же делать, если данные необходимо как-то систематизировать? Обычно они представляются в виде таблицы. Именно для этих целей и служат многомерные и, в частности, двумерные массивы.

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

Общий вид объявления двумерных массивов выглядит так:

<Имя массива> : array[<нижняя граница массива1>..<верхняя граница массива1>,<нижняя граница массива2>..<верхняя граница массива2>] of <тип данных>;

Например:

Var

Matrix : array[1..5,1..5] of integer;

Именно таким образом в программах представляются матрицы, т.е. двумерные таблицы чисел. Для того, чтобы реализовать ввод матрицы в компьютер с клавиатуры, необходимо использовать вложенные циклы:

For i:=1 to 5 do

For j:=1 to 5 do

Read(Matrix[i,j]);

Здесь i и j – счетчики, объявляемые в разделе var. Они должны быть целочисленного типа (byte, integer).

Алгоритм такого кода:

Взгляните на эту таблицу:

i \ j 1 2 3 4 5

1 11 12 13 14 15

2 21 22 23 24 25

3 31 32 33 34 35

4 41 42 43 44 45

5 51 52 53 54 55

По горизонтали изменяется значение j (номер столбца), а по вертикали – i (номер строки). Каждый конкретный элемент однозначно определяется этими двумя значениями. Например, возьмем элемент 43 – он располагается в 4 строке, 3 столбце. Соответственно, для него i=4,j=3. При использовании вложенных циклов (как было показано выше) последовательно идет работа с элементами первой строки, потом второй, третьей, четвертой, пятой. Вот как можно вывести матрицу на экран:

For i:=1 to 5 do

For j:=1 to 5 do

Write(Matrix[i,j]);

Однако выведенные данные в таком случае будут выглядеть некрасиво, т.к. будут идти сплошным, неразделимым потоком в одну строчку. Поэтому нужно, во-первых, после каждого элемента вставлять пробел, а во-вторых, после каждой выведенной строки переходить на новую с помощью оператора WriteLn (не забудьте также добавить операторные скобки begin и end для тела старшего цикла):

For i:=1 to 5 do

begin

For j:=1 to 5 do

Write(Matrix[i,j],’ ‘);

WriteLn;

end;

Алгоритм:

Так выводимая матрица будет уже выглядеть как матрица, а не хаотический набор символов.

Пример

Попробуйте самостоятельно написать программу, которая бы принимала с клавиатуры матрицу 3х3 и выводила бы матрицу 3х3, получаемую из исходной заменой столбцов строками (транспонированием):

123 147

456 258

789 369

Решение

Program example_1;

Var

i,j : integer;

a: array[1..3,1..3] of integer;

begin

For i:=1 to 3 do

For j:=1 to 3 do

Read(a[i,j]);

For j:=1 to 3 do

begin

For i:=1 to 3 do

Write(a[i,j],’ ‘);

WriteLn;

end;

end.

Обратите внимание: мы не делали никаких преобразований с самим массивом, мы просто поменяли порядок прохождения циклов (теперь сначала проматывается i, а потом уже j).

Работая с матрицами как с массивами, всегда следует искать какие-либо определенные закономерности в индексах, чтобы облегчить решение поставленной задачи. Вот несколько примеров:

Элементы главной диагонали матрицы i=j

Элементы выше главной диагонали матрицы i<j

Элементы ниже главной диагонали матрицы i>j

Элементы побочной диагонали i+j=n+1 (n - порядок матрицы)

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

Пример:

Вывести элементы главной диагонали матрицы 9х9.

Решение

Program example_2

Var

i,j : integer;

a: array[1..9,1..9] of integer;

begin

For i:=1 to 9 do

For j:=1 to 9 do

Read(a[i,j]);

For i:=1 to 9 do

For j:=1 to 9 do

If i=j then write(a[i,j],’ ‘);

end.

Иногда в условии не сказано прямо, какого порядка должна быть матрица. В этих случаях следует писать программу, являющуюся общим решением для разных размеров матрицы. Размеры же следует задавать в разделе констант. Переделаем пример 1 для матрицы произвольного размера (однако не следует брать ширину слишком большой, памятуя об ограничениях экрана):

Program example_3;

Const

n=9, m=7

Var

i,j : integer;

a: array[1..n,1..m] of integer;

begin

For i:=1 to n do

For j:=1 to m do

Read(a[i,j]);

For j:=1 to n do

begin

For i:=1 to m do

Write(a[i,j],’ ‘);

WriteLn;

end;

end.

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

В случае, когда размеры матрицы, необходимо также вводить в начале программы, нужно просто использовать массив заведомо большего размера:

Program example_4;

Var

i,j,n,m : integer;

a: array[1..25,1..25] of integer;

begin

Read(n,m);

For i:=1 to n do

For j:=1 to m do

Read(a[i,j]);

For j:=1 to n do

begin

For i:=1 to m do

Write(a[i,j],’ ‘);

WriteLn;

end;

end.

Здесь n и m уже становятся переменными целочисленного типа, вводимыми с клавиатуры. Далее мы просто используем только часть массива, ограниченную этими размерами. Такой подход обусловлен тем, что границы массива необходимо задавать на этапе создания программы, поэтому мы не можем изменить их в процессе ее выполнения.

Часто приходится не просто вывести определенные элементы массива, но и сделать что-либо еще: подсчитать их количество, поменять местами и т.д. Для этого вводятся дополнительны переменные: счетчики, переменные для временного хранения данных. Вот пример, в котором в каждой строке матрице mxn выделяются минимальные и максимальные значения, которые потом меняются местами.

В фигурные скобки заключены комментарии к коду программы.

program example_5;

var

i,j,m,n: byte;

a: array[1..20,1..20] of integer;

{переменные для сохранения координат искомых значений}

xmin,ymin,xmax,ymax : byte;

{буфер для сохранения одного из значений при обмене}

buf : integer;

begin

{Размерность матрицы считываем прямо во время работы программы. Однако следует отдавать себе отчет в том, что это значение не может превышать заданные нами размеры массива (20х20)}

Read(m,n);

for i:=1 to n do

for j:=1 to m do

Read(a[i,j]);

{в главном цикле увеличивается номер строки – первый индекс элемента}

for i:=1 to n do

begin

{устанавливаем начальные значения переменным – номер текущей строки и1}

xmax:=i;

ymax:=1;

xmin:=i;

ymin:=1;

{Во внутреннем цикле увеличивается второй индекс элемента}

for j:=2 to m do

begin

{Если просматриваемый элемент больше предыдущего выделенного, он считается максимальным, и переменным присваиваются номера его индексов}

if a[xmax,ymax]<a[i,j] then begin

xmax:=i;

ymax:=j;

end;

{Аналогично для поиска минимального элемента}

if a[xmin,ymin]>a[i,j] then

begin

xmin:=i;

ymin:=j;

end;

end;

{Для обмена двух переменных значениями: 1.Запоминаем значение одной из них в третью переменную (буфер). 2 Присваиваем первой переменной значение второй. 3. Присваиваем второй переменной значение буфера}

buf:=a[xmin,ymin];

a[xmin,ymin]:=a[xmax,ymax];

a[xmax,ymax]:=buf;

{Выводим обработанную строку. В каждом проходе главного цикла мы обрабатываем по одной строке}

for j:=1 to m do Write(a[i,j],' ');

WriteLn;

end;

end.

Если необходимо вычислить определенные элементы и сохранить в каком-либо виде их индексы, можно сохранить индексы в виде десятичных чисел. Например, вот как можно запомнить в виде массива y индексы элементов массива x, значения которых меньше 0:

For i:=1 to n do

For j:=1 to m do

if x[i,j] < 0 then

begin

k:=k+1;

y[k]:=10*i+j;

end;

Здесь индекс 1-1, например, сохраняется в виде числа одиннадцать, индекс 2-3 – в виде числа двадцать три. Однако следует учесть, что если ширина матрицы превысит 9, то номера элементов будут сохраняться некорректно. Тогда следует придумать более хитрый способ, воспользовавшись проверкой этого значения на превышение 9. Попробуйте сделать это самостоятельно.

Задания

А

  1. Напишите программу, находящую максимальные элементы в каждой строке матрицы 4х4 и сохраняющую их в виде отдельного одномерного массива.

  2. Напишите программу, находящую минимальные элементы в каждой строке матрицы 4х4 и сохраняющую их в виде отдельного одномерного массива.

  3. Напишите программу, находящую максимальные элементы в каждом столбце матрицы 4х4 и сохраняющую их в виде отдельного одномерного массива.

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

  5. Напишите программу, ищущую в массиве 5х5 все элементы, равные 1, и заменяющую их на 0.

  6. Напишите программу, заменяющую все элементы главной диагонали на 0.

  7. Напишите программу, заменяющую все элементы побочной диагонали на 0.

  8. Напишите программу, находящую сумму элементов в каждой строке матрицы 3х3 и выводящую эти суммы в виде отдельного массива.

  9. Напишите программу, находящую сумму элементов в каждом столбце матрицы 3х3 и выводящую эти суммы в виде отдельного массива.

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

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

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

  13. Напишите программу, складывающую соответствующие элементы двух матриц 3х3 и сохраняющую эти суммы в виде третьей матрицы.

  14. Напишите программу, меняющую знак каждого элемента матрицы 4х4 на противоположный.

  15. Напишите программу, ищущую отрицательные элементы в матрице 3х3 и сохраняющую их в виде отдельного одномерного массива.

  16. Напишите программу, ищущую отрицательные элементы в матрице 3х3 и сохраняющую их индексы в виде отдельного одномерного массива.

  17. Напишите программу, ищущую в матрице 3х3 максимальный и минимальный элемент и меняющую их местами.

  18. Напишите программу, ищущую в каждой строке матрицы 3х3 максимальный и минимальный элемент и меняющую их местами.

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

  20. Напишите программу, сохраняющую элементы первых двух строк матрицы 8х8 в виде другой матрицы 4х4.

  21. Напишите программу, сохраняющую первые 9 положительных элементов матрицы 8х8 в виде другой матрицы 3х3, а в случае, если их меньше 9, заменяющую недостающие элементы на 0.

  22. Напишите программу, ищущую все элементы матрицы 4х4, которые больше 5, и сохраняющую их в виде отдельного одномерного массива.

  23. Напишите программу, транспонирующую матрицу 4х4 и сохраняющую результат в виде другой матрицы.

  24. Напишите программу, выводящую произведение сумм элементов главной и побочной диагонали матрицы 3х3.

  25. Напишите программу, выводящую сумму произведений элементов главной и побочной диагонали матрицы 3х3.

  26. Напишите программу, выводящую элементы главной диагонали, кратные 5.

  27. Напишите программу, выводящую индексы элементов матрицы 4х4, являющихся простыми числами (т.е. делящимися без остатка только на себя и на 1).

  28. Напишите программу, которая возводит все элементы главной диагонали матрицы 5х5 в куб и сохраняет результат в виде другой матрицы.

B

  1. Напишите программу, которая транспонирует матрицу 5х5, затем умножает каждый ее элемент на 2, вычитает из каждого элемента 3, у всех отрицательных элементов отбрасывает знак -, все элементы больше 10 заменяет на 10 и выводит полученный результат.

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

  3. Напишите программу, которая находит произведение двух матриц 3х3 и сохраняет полученный результат в виде третьей матрицы.

a11 a12 a13 b11 b12 b13 c11 c12 c13

a21 a22 a23 x b21 b22 b23 = c21 c22 c23

a31 a32 a33 b31 b32 b33 c31 c32 c33

c11= a11*b11+ a12*b21+ a13*b31

c12= a11*b12+ a12*b22+ a13*b32

и т.д.

  1. Напишите программу, подсчитывающую дискриминант матрицы 3х3 для 5 различных значений первого элемента матрицы и выводящую результат. Формула дискриминанта:

D(a) = a11*a22*a33 +a12*a23*a31+ a13*a21*a32 – (a13*a22*a31 +a12*a21*a33+ a11*a23*a32)

  1. Напишите программу, заполняющую матрицу 8х8 элементами от 1 до 64 зигзагами, как показано на схеме:

  1. Напишите программу, заполняющую матрицу 8х8 элементами от 1 до 64 зигзагами, как показано на схеме:

  1. Напишите программу, заполняющую матрицу 8х8 элементами от 1 до 64 по спирали, начиная с края:

  1. Напишите программу, заполняющую матрицу 8х8 элементами от 1 до 64 по спирали, начиная из центра:

  1. Напишите программу, заполняющую матрицу 8х8 элементами от 1 до 64 по диагонали:

  1. Напишите программу, заполняющую матрицу 8х8 элементами от 1 до 64 по диагонали:

  1. Напишите программу, которая создает мини-календарь текущего месяца. При этом число месяца задается индексом массива (т.е. массив должен быть 10х10), а день недели – элементом массива. Программа должна по запрашиваемому числу выводить соответствующий ему день недели, и по запрошенному дню недели выводить количество таких дней в месяце и их список.

  2. Напишите программу, которая создает трехмерную матрицу 5х5х5 и в зависимости от введенного значения (от 1 до 6) выводит одну из 6 внешних граней в виде матрицы 5х5.

  3. Напишите программу, которая ищет кратчайший путь из левого верхнего угла в правый нижний угол матрицы 4х4 и выводит результат в виде последовательности индексов элементов, по которым проходит этот путь. При этом элементы, содержащие 0, считать непроходимыми. Программа должна работать для любой матрицы!

  4. Напишите программу, которая ищет с матрице 11х11 простые числа (числа, делящиеся без остатка только на себя и на 1) и сохраняющую индексы таких элементов в отдельном массиве.

  5. Напишите программу, которая проверяет, является ли матрица магическим квадратом, т.е. равна ли сумма элементов в каждой строке сумме элементов в каждом столбце. Пример магического квадрата:

1 3 6

5 2 3

4 5 1

Сумма элементов в каждой строке и в каждом столбце здесь равна 10.

1 3 4 7

6 5 3 1

4 5 6 0

4 2 2 7

А здесь – 15.

  1. Написать программу, которая в каждом столбце матрицы 7х7 сортирует элементы по возрастанию.

  2. Написать программу, которая сортирует строки матрицы 7х7 по возрастанию сумм их элементов.