Задать расположение элементов двумерного массива - PascalABC.NET
Формулировка задачи:
Нужно написать программу на паскале, в которой элементы двумерного массива будут располагаться следующим образом.
Заранее благодарю.
Решение задачи: «Задать расположение элементов двумерного массива»
textual
Листинг программы
- const
- MaxCol = 4; // 6;
- MaxRow = 4;
- type
- TRowIndex = 1 .. MaxRow;
- TColIndex = 1 .. MaxCol;
- TItem = Integer;
- TDirection = (right, left_down, down, right_up);
- const
- delta: array[TDirection] of record X, Y: integer end =
- ( (X: 1; Y: 0), (X:-1; Y: 1), (X: 0; Y: 1), (X: 1; Y:-1) );
- // получаем позицию ячейки, и направление движения, возвращаем
- // позицию следующей ячейки (и, если изменилось - новое направление), в порядке обхода "змейкой"
- function get_next(var dir: TDirection; var col, row : integer) : boolean;
- var
- new_col, new_row: integer;
- ok: boolean;
- begin
- get_next := false;
- if (row = MaxRow) and (col = MaxCol) then exit;
- case dir of
- right:
- if row = 1 then dir := left_down
- else dir := right_up;
- down:
- if col = 1 then dir := right_up
- else dir := left_down;
- end;
- repeat
- new_col := col + delta[dir].x; new_row := row + delta[dir].y;
- ok := (new_col >= 1) and (new_col <= MaxCol) and (new_row >= 1) and (new_row <= MaxRow);
- if not ok then
- case dir of
- right: dir := down;
- left_down: dir := down;
- down: dir := right;
- right_up: dir := right;
- end;
- until ok;
- col := new_col; row := new_row;
- get_next := true;
- end;
- var
- a : array[TRowIndex, TColIndex] of TItem;
- dir : TDirection;
- i, k, C, R, pC, pR : Integer;
- T : TItem;
- begin
- writeln('Init matrix:');
- for R in TRowIndex do
- begin
- for C in TColIndex do
- begin
- a[R, C] := random(200);
- write(a[R, C]:4);
- end;
- writeln;
- end;
- // Вот она, самая простая пузырьковая сортировка:
- for K := MaxRow * MaxCol - 1 downto 1 do
- begin
- C := 1; R := 1; // Начинаем обход всегда с левой верхней ячейки, (1, 1)
- dir := right_up; // направление движения задаем "по диагонали, вправо и вверх"
- for i := 1 to K do
- begin
- pC := C; pR := R; // Это позиция предыдущей найденной ячейки.
- get_next(dir, C, R); // Запоминаем ее и ищем следующую
- if a[pC, MaxCol - pR + 1] > a[C, MaxCol - R + 1] then // А теперь (по алгоритму "пузызька") сравниваем предыдущую со следующей
- begin
- T := a[pC, MaxCol - pR + 1];
- a[pC, MaxCol - pR + 1] := a[C, MaxCol - R + 1];
- a[C, MaxCol - R + 1] := T;
- end;
- end;
- end;
- writeln('Result matrix:'); // Всё, вывод результата
- for R in TRowIndex do
- begin
- for C in TColIndex do
- begin
- write(a[R, C]:4);
- end;
- writeln;
- end;
- end.
Объяснение кода листинга программы
В данном коде реализована сортировка двумерного массива методом пузырька
. Вот список действий, которые происходят в коде:
- Инициализация двумерного массива случайными значениями от 200 до 1.
- Создание переменных для хранения текущей позиции (C, R), направления движения (dir), а также для хранения предыдущей позиции (pC, pR).
- Обход массива в порядке, заданном направлением движения (по умолчанию -
по диагонали, вправо и вверх
). - Сравнение значения ячейки по текущей позиции с значением ячейки по предыдущей позиции.
- Если значение ячейки по текущей позиции больше, то значения ячеек меняются местами.
- После завершения цикла, результат сортировки выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д