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

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

Форум «Всё о Паскале» _ Задачи _ Шифровальный квадрат

Автор: -Slavok- 23.04.2005 13:26

Помогите со след. задачей.
Дана след. матрица:
(0, 1, 0, 1, 0, 0, 1, 0)
(0, 0, 0, 0, 1, 0, 0, 0)
(1, 0, 1, 0, 0, 0, 1, 0)
(0, 0, 0, 1, 0, 0, 0, 0)
(0, 1, 0, 0, 0, 1, 0, 0)
(1, 0, 0, 0, 1, 0, 0, 0)
(0, 0, 1, 0, 0, 0, 1, 0)
(0, 0, 0, 1, 0, 0, 0, 1)
Вводится строка. Просматривается шифр. квадрат, если его элемент равен 1, то в новую символьную матрицу 8x8 на пересечении i-ого строки и j-ого столбца, т.е. там, где была 1 в шифр. квадрате, ставится текущий символ строки. Если шифр. кв. закончился, а строка нет, то шифр. кв. поворачивается вправо на 90 градусов и начинается просмотр нового шифр. кв. Процесс происходит пока не закончится строка. В рез-те мы получили симв. матрицу с зашифрованным текстом.
Стока длиной не более 64 символов.
Программу написал, но работет она неправильно, помогите найти ошибку или какой-нибудь др. метод решения. Заранее благодарю.
Вот код программы:

Код

uses
 Crt;
type
 Mass = array [1..8, 1..8] of 0..1;
var
 S, S1 : String;
 NewM : array [1..8, 1..8] of Char; {Матрица с зашифрованным текстом}
 P, I, J : Word;
 Bool : Boolean;
const
 Matr : Mass = ((0, 1, 0, 1, 0, 0, 1, 0),
                       (0, 0, 0, 0, 1, 0, 0, 0),
                       (1, 0, 1, 0, 0, 0, 1, 0),
                       (0, 0, 0, 1, 0, 0, 0, 0),
                       (0, 1, 0, 0, 0, 1, 0, 0),
                       (1, 0, 0, 0, 1, 0, 0, 0),
                       (0, 0, 1, 0, 0, 0, 1, 0),
                       (0, 0, 0, 1, 0, 0, 0, 1));

procedure ReadData;
var
 F : Text;
begin
 Assign(F, 'Text.txt');
 Reset(F);
 ReadLn(F, S);
 Close(F)
end;

procedure Povorot(var A : Mass);
var
 B : Mass;                          {Поворот матрицы A на 90 градусов}
 I, J : Word;
begin
 for I := 1 to 8 do
   for J := 1 to 8 do B[I, J] := 0;
 for I := 1 to 8 do
   for J := 1 to 8 do B[I, 9 - J] := A[J, I];
 for I := 1 to 8 do
   for J := 1 to 8 do A[I, J] := B[I, J];
end;

begin
 ClrScr;
 ReadData;
 for I := 1 to 8 do
   for J := 1 to 8 do NewM[I, J] := ' ';
 P := 1; Bool := True;
 while P <= Length(S) do
   begin
      I := 1; J := 1;
      while (I <= 8) and (Bool) do
         begin
            while J <= 8 do
               begin
                  if Matr[I, J] = 1
                  then
                     begin
                       NewM[I, J] := S[P];
                       Inc(P);
                       if P > Length(S)
                       then
                          begin
                            Break;
                            Bool := False
                          end;
                     end;
                  Inc(J)
               end;{Конец цикла с J}
            Inc(I);
            J := 1;
         end;{Конец цикла с I}
      if (P = 17) or (P = 33) or (P = 49)
      then Povorot(Matr)
   end;
 S1 := '';
 for I := 1 to 8 do
   for J := 1 to 8 do S1 := S1 + NewM[I, J];
 I := Length(S1);
 while S1[I] = ' ' do
   begin
     Delete(S1, I, 1);
     Dec(I)
   end;
 Write(S1);
end.

Автор: volvo 23.04.2005 16:26

Значит, первое, что бросается в глаза - это то, КАК ты реализовал процедуру Povorot blink.gif
Я бы делал так:

Procedure Povorot(Var a: Mass);
var
B: Mass;
i, j: integer;
begin
for i := 1 to n do
for j := 1 to n do
B[j, n - i + 1] := m[i, j];
a := B;
end;


И потом, как именно ты определяешь, что программа работает неправильно? У тебя есть какие-то тесты?

Автор: klem4 26.04.2005 0:37

может я чего-то не понимаю, но что делать в том случае если после очередного поворота матрицы единичка окажется на том месте на котором уже была, то етсь букву надо записать на то место, которое уже занято ??