Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Работа с матрицами

Автор: Цырилла 19.02.2007 0:03

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

Автор: TS* 19.02.2007 0:23

Цитата(Цырилла @ 18.02.2007 19:03) *

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

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

Автор: klem4 19.02.2007 13:42

http://forum.pascal.net.ru/index.php?showtopic=2694&st=0&p=27640&#entry27640

Заполнение матрицы по спирали + воспользуйся поиском выкладывались разные варианты, посмотри как это делается.

Автор: volvo 19.02.2007 18:24

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

Цырилла
Вот пример заполнения матрицы так, как тебе нужно - обработку текста добавь сама...

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 19.02.2007 20:53

Цитата
раскручивающейся из центра я по крайней мере не нашел...


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

Автор: volvo 19.02.2007 21:18

Эта что-ли? smile.gif
http://forum.pascal.net.ru/index.php?s=&showtopic=13790&view=findpost&p=80218

Так тут наоборот - от границ в центр матрицы...

Автор: Цырилла 19.02.2007 23:34

Огромное спасибо, это как раз то, что нужно

Автор: Feagor 25.12.2008 2:34

Необходимо зашифровать текст из 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 25.12.2008 2:52

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

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

2)
  vihod[0] := chr(n*n); { <--- Добавить вот это }
writeln(vihod);
readkey;

Автор: Feagor 25.12.2008 2:59

пасибо, 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.