Advertisement
Infiniti_Inter

For Maks 2nd

Dec 11th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.87 KB | None | 0 0
  1. program main;
  2.  
  3. const
  4.   NN = 10;//Фактическое ограничение матрицы(максимальное значение n)
  5.  
  6. type
  7.   mtr = array[1..NN, 1..NN] of integer;//Матрица n * n
  8.  
  9. type
  10.   mas = array[1..NN] of integer;
  11.  
  12. var
  13.   n, i, j: integer;
  14.   a: mtr;
  15.   n1, n2: string;
  16.  
  17. procedure swap(var a, b: integer);
  18. begin
  19.   if (a - b = 0) then exit;//Максимально важная проверка. без нее При совпадающих элементах массива, т.е. swap(a[i], a[i]), возвращает a[i] = 0!!
  20.   a := a + b;// a = 3, b = 4 ---> a = 7, b = 4
  21.   b := a - b;// a = 7, b = 4 ---> a = 7, b = 3
  22.   a := a - b;// a = 7, b = 3 ---> a = 4, b = 3;
  23.   // magic of numbers, nothing more \\
  24. end;
  25.  
  26. procedure InPut(var a: mtr; name: string);//процедура ввода. n - формальное ограничение матрицы
  27. var
  28.   i, j: integer;
  29.   input_t: text;
  30. begin
  31.   assign(input_t, name);
  32.   reset(input_t);
  33.   readln(input_t, n);
  34.   for i := 1 to n do
  35.   begin
  36.     for j := 1 to n do
  37.       read(input_t, a[i, j]);
  38.     readln(input_t);
  39.   end;
  40.   close(input_t);
  41. end;
  42.  
  43. procedure OutPut(var a: mtr; name: string);
  44. var
  45.   i, j: integer;
  46.   output_t: text;
  47. begin
  48.   assign(output_t, name);
  49.   rewrite(output_t);
  50.   for i := 1 to n do
  51.   begin
  52.     for j := 1 to n do
  53.       write(output_t, a[i, j]:3);
  54.     writeln(output_t);
  55.   end;
  56.   close(output_t);
  57. end;
  58.  
  59. procedure Insertion_sort(var t: mas; size: integer);
  60. var
  61.   cur, i, j: integer;
  62. begin
  63.   for i := 2 to size do
  64.   begin
  65.     cur := t[i];
  66.     for j := i - 1 downto 1 do
  67.       if (cur < t[j]) then
  68.         swap(t[j + 1], t[j])
  69.       else
  70.         break;
  71.   end;  
  72. end;
  73.  
  74. procedure SortDiagonal(var a: mtr);
  75. var
  76.   tmp: mas;//вспомогательный массив
  77.   i, j: integer;
  78. begin
  79.   for i := n - 1 downto 1 do//Выше главной D
  80.   begin
  81.     for j := 1 to i do
  82.       tmp[j] := a[i - j + 1, j];
  83.     Insertion_sort(tmp, i);
  84.     for j := 1 to i do
  85.       a[i - j + 1, j] := tmp[j];
  86.   end;
  87.   for i := n downto 1 do// Гл. D
  88.     tmp[i] := a[i, n - i + 1];
  89.   Insertion_sort(tmp, n);
  90.   j := 1;
  91.   for i := n downto 1 do
  92.   begin
  93.     a[i, n - i + 1] := tmp[j];
  94.     j := j + 1;
  95.   end;
  96.   for i := 2 to n do //Ниже главной D
  97.   begin
  98.     for j := n downto i do
  99.       tmp[j - i + 1] := a[n + i - j, j];
  100.     Insertion_sort(tmp, n - i + 1);
  101.     for j := n downto i do
  102.       a[n + i - j, j] := tmp[j - i + 1];
  103.   end;
  104. end;
  105.  
  106. var
  107.   b: mas;
  108.  
  109. begin
  110.   n1 := 'input.txt';{имена файлов}
  111.   n2 := 'output.txt';
  112.   InPut(a, n1);//ввод матрицы a из файла n, размерность задается в процедудере
  113.   SortDiagonal(a);//функция сортировки
  114.   OutPut(a, n2);//вывод матрицы, по заданной n(глобальная переменная)
  115.  
  116. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement