Помощь - Поиск - Пользователи - Календарь
Полная версия: Подскажите, как правильно написать и оформить функции
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Pistoletka
Пусть дана вещественная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n, так:
а) крест-накрест;
б) по часовой стрелке.
Для обмена четырех заданных фрагментов матрицы напишите функцию.
Федосеев Павел
Покажите, а что вы уже сделали.
Поймите и меня - нет желания плодить неграмотность.
Pistoletka
Цитата(Федосеев Павел @ 18.04.2016 22:19) *

Покажите, а что вы уже сделали.
Поймите и меня - нет желания плодить неграмотность.

Только сейчас заметила сообщение. Выдает ошибку, что "Индекс находился вне границ массива"
const n=2;
type matr=array[1..2*n,1..2*n] of integer;
var a:matr;
procedure vv_mas (var x:matr; s:string; f:boolean);
var i,j:integer;
begin
 writeln(s);
 for i:=1 to 2*n do
  for j:=1 to 2*n do
  readln (x[i,j]);
  writeln;
 for i:=1 to 2*n do
  begin
   for j:=1 to 2*n do
    write (x[i,j]:3);
    writeln;
  end;
end;  
procedure swap2 (var x:matr; s:string);
var i,j,a,b,c,d:integer;
begin
 for i:=1 to 2*n do
  for j:=1 to 2*n do
   begin
    a:=x[i,j];
    b:=x[i,j+n-1];
    c:=x[i+n-1,j+n-1];
    d:=x[i+n-1,j];
    x[i,j]:=d;
    x[i,j+n-1]:=a;
    x[i+n-1,j+n-1]:=b;
    x[i+n-1,j]:=c;
   end;
 for i:=1 to 2*n do
  begin
   for j:=1 to 2*n do
    write(x[i,j]:3);
    writeln;
  end;
end;
Begin
 vv_mas (a, 'A:', true);
 swap2(a, 'A:')
End. 
Федосеев Павел
Вы молодец!
В swap2 несколько ошибок.
1. оба цикла по i и по j должны быть до n. Ведь мы перемещаем по часовой стрелке только один блок, а остальные перемещаются в ходе сдвига.
2. в индексах лишние вычитания 1.
Исправьте и всё заработает.
Федосеев Павел
Я попробовал самостоятельно свои процедуры, но и вашу поправил.

Смотрите. В задании сказано, что числа действительные - т.е. real, а не integer. Для отладки я также использовал integer, но вам следует заменить.
const
  n  = 2;
  n2 = 2 * n;
type
  TType = integer;
  matr  = array[1..n2, 1..n2] of TType;

  procedure Show(var M: matr);
  var
    i, j: integer;
  begin
    for i := 1 to n2 do
    begin
      for j := 1 to n2 do
        Write(M[i, j]: 3);
      writeln;
    end;
  end;

  procedure vv_mas(var x: matr; s: string; f: boolean);
  var
    i, j: integer;
  begin
    writeln(s);
    for i := 1 to n2 do
      for j := 1 to n2 do
        {readln(x[i, j]);}
        x[i, j] := i * 10 + j;
    writeln;
  end;

  procedure SwapAB(var A, B: TType);
  var
    t: TType;
  begin
    t := A;
    A := B;
    B := t;
  end;

  {перестановка крест-накрест}
  procedure SwapX(x: matr);
  var
    i, j: integer;
  begin
    for i := 1 to n do
      for j := 1 to n2 do
        SwapAB(x[i, j], x[n + i, (n + j - 1) mod n2 + 1]);
    Show(x);
  end;

  {перестановка по часовой стрелке}
  procedure SwapC(x: matr);
  var
    i, j: integer;
    t: TType;
  begin
    for i := 1 to n do
      for j := 1 to n do
      begin
        SwapAB(x[i, j], x[i + n, j]);
        SwapAB(x[i + n, j], x[i + n, j + n]);
        SwapAB(x[i + n, j + n], x[i, j + n]);
      end;
    Show(x);
  end;

  procedure swap2(x: matr; s: string);
  var
    i, j, a, b, c, d: integer;
  begin
    for i := 1 to n do
      for j := 1 to n do
      begin
        a := x[i, j];
        b := x[i, j + n];
        c := x[i + n, j + n];
        d := x[i + n, j];
        x[i, j] := d;
        x[i, j + n] := a;
        x[i + n, j + n] := b;
        x[i + n, j] := c;
      end;
    for i := 1 to 2 * n do
    begin
      for j := 1 to 2 * n do
        Write(x[i, j]: 3);
      writeln;
    end;
  end;

var
  a: matr;
begin
  vv_mas(a, 'A:', True);
  Show(a);
  writeln('Перестановка исходной матрицы крест-накрест');
  SwapX(a);
  writeln('Перестановка исходной матрицы по часовой стрелке');
  SwapC(a);
  writeln('swap2');
  swap2(a, '----A');
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.