Задать расположение элементов двумерного массива - 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.

Объяснение кода листинга программы

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

  1. Инициализация двумерного массива случайными значениями от 200 до 1.
  2. Создание переменных для хранения текущей позиции (C, R), направления движения (dir), а также для хранения предыдущей позиции (pC, pR).
  3. Обход массива в порядке, заданном направлением движения (по умолчанию - по диагонали, вправо и вверх).
  4. Сравнение значения ячейки по текущей позиции с значением ячейки по предыдущей позиции.
  5. Если значение ячейки по текущей позиции больше, то значения ячеек меняются местами.
  6. После завершения цикла, результат сортировки выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.333 из 5
Похожие ответы