Урок Информатики "ТРАНСПОНИРОВАНИЕ МАТРИЦЫ"

ФИО автора: Трофимов Виктор Геннадьевич

Место работы: ГКООУ санаторная школа-интернат №28 г. Ростова-на-Дону

Должность: учитель информатики и ИКТ





ТРАНСПОНИРОВАНИЕ МАТРИЦЫ



Задача: дана матрица K[X, Y], значения X и Y вводятся пользователем (не более 10), матрица заполняется случайными целыми числами. Сформировать транспонированную матрицу P, вывести её на экран.



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



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

При работе с двумерными матрицами очень часто программисты путают значения осей x и y, для избегания такой путаницы достаточно представить трансформированную декартову систему координат, где точка 0 будет находиться в левом верхнем углу, ось X - вертикальная, ось Y - горизонтальная. Чёткое понимание подобной модели даст преимущество в написании программы и позволит не путаться между счётчиками цикла i, j.



Декартова система координат:



О

с

ь



Y

6















5















4















3















2















1















0

1

2

3

4

5

6



Ось X





Система координат для работы с массивами:





Ось Y / j

О

с

ь



X

/

i

0

1

2

3

4

5

6



1















2















3















4















5















6















Опираясь на систему координат с измененными осями X и Y нам не составит труда проконтролировать работу вложенного цикла (с которым обычно и происходит путаница при работе с двумерными массивами).



Идея проста. Определяем двумерный массив размерностью X, Y, заносим случайные числа от -128 до +127 и следующим же шагом транспонируем матрицу.



Сама программа реализует следующее:

1. Запрашиваем у пользователя значения X и Y

2. Если хоть одно значение больше 10, то присваиваем ему 10.

3. С помощью вложенного цикла заполняем массив k случайными числами.

4. Выводим на экран массив k для контроля.

5. Транспонируем массив, одновременно передавая значения в массив p.

6. Выводим результат на экран.

7. Готово!



Ниже привожу блоки программы с пояснением:



program transponirovanie; 	// название программы

uses crt;				// библиотека для использования процедур очистки экрана и

					// финального ожидания нажатой клавиши



var 	k: array [1..10, 1..10] of shortint;	// объявление первого массива

    	p: array [1..10, 1..10] of shortint;	// объявление второго массива

   	x, y, i, j: byte;				// переменные, нужные нам для ввода

							// пользователем размерности массива

							// и для счётчиков цикла



Для массивов взяты значения типа shortint, позволяющие указать данные в диапазоне от -128 до +127, целые числа. Для размерности массива и счётчиков цикла достаточно значения типа byte, так как даже в максимальном случае у нас получится всего 10 итераций для любого из циклов.



begin			// Начало программы

   clrscr;			// Очистка экрана

   randomize;		// Активация генератора случайных чисел



В этом блоке вводятся значения с клавиатуры - X и Y, после чего выполняется проверка. Если X или Y больше 10, то им присваивается максимально возможноей значение - 10.



   write('Введите размер матрицы (X x Y), не больше 10 ');

   readln(x, y);

   if (x > 10) then x := 10;

	if (y > 10) then y := 10;



Заполнение массива. Не забываем, что x - «подправленная» ось нашей системы координат, направлена слева-сверху вниз. Y - горизонтальная ось, увеличение происходит слева-направо.



   for i := 1 to x do

    for j := 1 to y do

    begin

       k[i, j] := -128 + random(256);	// Генератор случайных чисел, который формирует число

					// от -128 до +127 (минимальный random(256) может

					// вернуть число 0, а максимальный число 255)

       gotoxy(j * 5, 1 + i);		// Позиция на экране для вывода значения

       writeln(k[i, j]);		// Вывод массива для контроля

    end;



Здесь выполняется транспонирование матрицы. Всё просто - меняем оси местами, «вращая» массив на 90 градусов по часовой стрелке. Это достигается путём замены счётчиков цикла i (ось x в исходном массиве) на j (ось y в исходном массиве). Вообразите шахматную доску с расставленными фигурами и «поверните» её на девяносто градусов, тогда стоявшие вверху фигуры окажутся расположены на правой линии, второй сверху ряд - на второй справа линии и так далее. В приведенном коде происходит то же самое.

(Труднее будет перевернуть матрицу на заданное количество градусов, допустим, 45 по часовой, или 30 против часовой. Некоторое подобие алгоритма применяется в игре тетрис, а более сложные его формы - практически во всех современных играх или программах, работающих с фото- видеоматериалами).



   for i := 1 to x do

      for j := 1 to y do

         p[j, i] := k[i, j];



Вывод получившегося транспонированного массива. Формирование позиций на экране для вывода значений происходит путём расчёта (j * 5, 2 + x + i), ось y, формируемая формулой 2 + x + i, всегда будет ниже, чем предыдущий вывод исходного массива.



   for i := 1 to y do

    for j := 1 to x do

    begin

       gotoxy(j * 5, 2 + x + i);

       writeln(p[i, j]);

    end;



   readkey;		// Ожидания нажатия клавиши

end.			// Наконец, конец программы!



Трудность алгоритма заключается именно в определении осей массива и умении программиста сориентироваться, переопределив оси X и Y так, чтобы они подходили для обработки в циклах for. Вот и всё :)



Удачи!