Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с матрицами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Цырилла
Необходимо зашифровать текст из 121 буквы, его необходимо записать в квадратную матрицу порядка 11 по стокам, начиная с центра (т. е. с элемента, имеющего индексы 6, 6), а затем по часовой стрелке все остальные символы.
Может кто раньше подобное делал подкажите.
TS*
Цитата(Цырилла @ 18.02.2007 19:03) *

Необходимо зашифровать текст из 121 буквы, его необходимо записать в квадратную матрицу порядка 11 по стокам, начиная с центра (т. е. с элемента, имеющего индексы 6, 6), а затем по часовой стрелке все остальные символы.
Может кто раньше подобное делал подкажите.

Просто используй алгоритм заполнение массива по спирали от середины, поищи здесь на форуме, если нет, то поищи в интернете, точно видел.
klem4
Массивы. Матрицы. Типичные задачи.

Заполнение матрицы по спирали + воспользуйся поиском выкладывались разные варианты, посмотри как это делается.
volvo
Насколько я помню, все, что выкладывалось на форуме - для заполнения "по спирали" - из какого-то угла матрицы. Спирали, раскручивающейся из центра я по крайней мере не нашел...

Цырилла
Вот пример заполнения матрицы так, как тебе нужно - обработку текста добавь сама...
function incr(var X: integer): integer;
begin
  incr := X; inc(X);
end;

const
  n = 11;
var
  n2,i,j,k,w : integer;
  a: array[1 .. n, 1 .. n] of word;
begin
  w := 1; n2 := n div 2;

  if n mod 2 = 1 then a[n2 + 1, n2 + 1] := incr(w);

  for k := 0 to n2 - 1 do begin

    for j := n2-k+1 to n-n2+k+1 do a[n2-k,j] := incr(w);
    for i := n2-k+1 to n-n2+k+1 do a[i,n-n2+k+1] := incr(w);
    for j := n-n2+k downto n2-k do a[n-n2+k+1,j] := incr(w);
    for i := n-n2+k downto n2-k do a[i,n2-k] := incr(w);

  end;

  for i := 1 to n do begin
    for j := 1 to n do write(a[i,j]:4);
    writeln;
  end;
end.
klem4
Цитата
раскручивающейся из центра я по крайней мере не нашел...


Была, как щас помню писал прогу, там задавалась точка в матрице (любая) в нее ставился ноль белым цветом а далее ее надо было "окружать" единичками, двойками итд по окружностям разными цветами, найти правда пока тоже не могу...
volvo
Эта что-ли? smile.gif
Двумерные массивы

Так тут наоборот - от границ в центр матрицы...
Цырилла
Огромное спасибо, это как раз то, что нужно
Feagor
Необходимо зашифровать текст из 121 буквы, его можно записать в квадратную матрицу порядка 11 по строкам, а затем прочитать по спирали, начиная с центра (т. е. с элемента, имеющего индексы 6, 6).
попытался сделать ипользуя готовый уже код,вот что получилось, но переменная vihod почему-то оказывааетяс пустая, плиз хелп!=)
uses crt;
function incr(var X: integer): integer;
begin
  incr := X; inc(X);
end;

const
  n =11;
var
  n2,i,j,k,w : integer;
  a: array[1 .. n, 1 .. n] of char;
  text,vihod:string;
begin
  clrscr;
  writeln('Vvedite text');
  readln(Text);
  if length(text)<n*n then
  for i:=length(text) to n*n do text[i]:='0';
  for i:=1 to n do
  for j:=1 to n do
  a[i,j]:=Text[(i-1)*n+j];
  w := 1; n2 := n div 2;

  if n mod 2 = 1 then vihod[incr(w)]:=a[n2 + 1, n2 + 1];

  for k := 0 to n2 - 1 do begin

    for j := n2-k+1 to n-n2+k+1 do vihod[incr(w)]:=a[n2-k,j];
    for i := n2-k+1 to n-n2+k+1 do vihod[incr(w)]:=a[i,n-n2+k+1];
    for j := n-n2+k downto n2-k do vihod[incr(w)]:=a[n-n2+k+1,j];
    for i := n-n2+k downto n2-k do vihod[incr(w)]:=a[i,n2-k];

  end;

  for i := 1 to n do begin
    for j := 1 to n do write(a[i,j]:4);
    writeln;
  end;
  writeln(vihod);
  readkey;
end.

volvo
Цитата
переменная vihod почему-то оказывааетяс пустая
Само собой, ты же полез во внутреннее представление сам, не используя процедуры Паскаля, значит, ответственность за установку длины - тоже на тебе:

1)
  text, vihod:string[n*n]; { <--- ограничить длину }

2)
  vihod[0] := chr(n*n); { <--- Добавить вот это }
  writeln(vihod);
  readkey;
Feagor
пасибо, volvo,лови +
smile.gif
ну и готовый листинг, если кому-то понадобится
uses crt;
function incr(var X: integer): integer;
begin
  incr := X; inc(X);
end;

const
  n = 11;
var
  n2,i,j,k,w : integer;
  a: array[1 .. n, 1 .. n] of char;
  text,vihod:string[n*n];
begin
 clrscr;
  writeln('Vvedite text');
  readln(Text);
  if length(text)<n*n then
  for i:=length(text) to n*n do text[i]:='0';
  for i:=1 to n do
  for j:=1 to n do
  a[i,j]:=Text[(i-1)*n+j];
  w := 1; n2 := n div 2;

  if n mod 2 = 1 then vihod[incr(w)]:=a[n2 + 1, n2 + 1];

  for k := 0 to n2 - 1 do begin

    for j := n2-k+1 to n-n2+k+1 do vihod[incr(w)]:=a[n2-k,j];
    for i := n2-k+1 to n-n2+k+1 do vihod[incr(w)]:=a[i,n-n2+k+1];
    for j := n-n2+k downto n2-k do vihod[incr(w)]:=a[n-n2+k+1,j];
    for i := n-n2+k downto n2-k do vihod[incr(w)]:=a[i,n2-k];

  end;

  for i := 1 to n do begin
    for j := 1 to n do write(a[i,j]:4);
    writeln;
  end;
  vihod[0]:=chr(n*n);
  writeln(vihod);
  readkey;
end.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.