Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2016, 16:54   #1
Kef1r
Форумчанин
 
Регистрация: 13.05.2016
Сообщений: 111
По умолчанию Магический квадрат

Здравствуйте, у меня есть прога с квадратом 4х4. Интерфейс следующий:1-я таблица-магический квадрат.
2-я таблица(изначально пустая)-в нее заносятся буквы, в соответствии с их нумерацией.
1-й Эдит - для ввода шифруемой фразы.
2-й Эдит - для вывода шифрованной фразы.
Проблема вот в чем: Если символов в поле для ввода больше 16, то должна создаваться третья таблица, в которую будут заноситься оставшиеся символы, не влезшие во вторую. Скрин в приложении.
Вот Код:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  key: array[0..3, 0..3] of integer = ((16,3,2,13),(5,10,11,8),(9,6,7,12),(4,15,14,1));
  text_str,str:string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k,l: integer;
begin

  Edit2.Text:='';
  for i:=0 to 3 do
  for l:=0 to 3 do
  Stringgrid2.Cells[i,l]:='';
  text_str:=Edit1.Text;     // В переменную text_str заносим символы, введенные в Edit
  j:=length(text_str);       // В переменную j заносим количество введенных в Edit символов
  if j> 16 then
  str:=text_str;

  for k:=1 to j do
  begin
    for i:=0 to 3 do
     for l:=0 to  3 do
     if Stringgrid1.Cells[i,l]=inttostr(k) then   // Если в первой таблице числа соответствуют нумерации каждого символа
     Stringgrid2.Cells[i,l]:=text_str[k];    // То во вторую (изначально пустую) таблицу заносим буквы в соответствии с их нумерацией
  end;

  for i:=0 to 3 do
       for l:=0 to 3 do
  Edit2.Text:=Edit2.Text+Stringgrid2.Cells[l,i];
end;


procedure TForm1.FormCreate(Sender: TObject);
var i,j: integer;
begin

StringGrid1.FixedCols := 0;
StringGrid1.FixedRows := 0;
StringGrid2.FixedCols := 0;
StringGrid2.FixedRows := 0;
edit1.Text:='';
edit2.Text:='';
  for i:=0 to 3 do
  for j:=0 to 3 do
   Stringgrid1.Cells[j,i]:=inttostr(key[i,j]);
end;
end.
Kef1r вне форума Ответить с цитированием
Старый 29.09.2016, 16:56   #2
Kef1r
Форумчанин
 
Регистрация: 13.05.2016
Сообщений: 111
По умолчанию

Скрин забыл)
Изображения
Тип файла: png Безымянный.png (9.6 Кб, 77 просмотров)
Kef1r вне форума Ответить с цитированием
Старый 30.09.2016, 11:43   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Если символов в поле для ввода больше 16, то должна создаваться третья таблица, в которую будут заноситься оставшиеся символы
Зачем третья, четвертая таблицы? лучше все эти таблицы наращивать в ОДНОЙ рабочей (StringGrid2)
добавляя к ней по четыре строки (наращивание вниз) или четыре столбца (наращивание вправо)

Код:
StringGrid2.rowcount:=0; // изначально в результирующей таблице(StringGrid2) НЕТ ни едной строки
drow:=-4; // при старте мы сразу добавим +4 и получим правильное смещение для рабочей части таблицы
  for k:=1 to j do
  begin
    if k mod 16 =1 then //мы начинаем новый блок 
    begin
      StringGrid2.rowcount:=StringGrid2.rowcount+4; //добавим место под еще один блок (он будет располагаться ниже следующие 4 строки) 
      drow:=drow+4;
    end;
    for i:=0 to 3 do
     for l:=0 to  3 do
     if Stringgrid1.Cells[i,l]=inttostr(k) then   // Если в первой таблице числа соответствуют нумерации каждого символа
      if key[i,l] =k then       
     Stringgrid2.Cells[i,l+drow]:=text_str[k];    // То во вторую (изначально пустую) таблицу заносим буквы в соответствии с их нумерацией
//надеюсь правильно индекс строки второй.

//А если немного повозиться с key и заранее (до цикла шифрования for k:=1... ) получить некую 
//    IndexKey: array [0..15, 1..2] of integer; //где у нас в ключе стоят нужные цифры
//то можно обойтись и без циклов for i:=0 ... for j:=0 ...
//      StringGrid2.Cells[IndexKey[k mod 16, 1], drow +IndexKey[k mod 16, 2] ]:=text_Str[k];
  end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.09.2016 в 11:56.
evg_m вне форума Ответить с цитированием
Старый 30.09.2016, 19:16   #4
Kef1r
Форумчанин
 
Регистрация: 13.05.2016
Сообщений: 111
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Зачем третья, четвертая таблицы? лучше все эти таблицы наращивать в ОДНОЙ рабочей (StringGrid2)
добавляя к ней по четыре строки (наращивание вниз) или четыре столбца (наращивание вправо)
Дело вот в чем: Магический квадрат - это квадратная матрица размера n.
И если в тексте для шифрования букв больше чем n^2, то текст разбивается на блоки(матрицы), где каждый блок не больше чем n^2.
Kef1r вне форума Ответить с цитированием
Старый 03.10.2016, 10:11   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
И если в тексте для шифрования букв больше чем n^2, то текст разбивается на блоки(матрицы)
Цитата:
лучше все эти таблицы наращивать в ОДНОЙ рабочей (StringGrid2)
добавляя к ней по четыре строки
Каждые четыре строки результирующей таблицы и ЕСТЬ один блок шифртекста.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Магический квадрат hpc Общие вопросы Delphi 1 22.11.2012 14:32
Магический квадрат МашаПолудницына C# (си шарп) 1 04.06.2012 11:19
магический квадрат Irk-O Помощь студентам 3 11.10.2010 13:00
Магический квадрат Arman Tokanov Помощь студентам 7 27.10.2009 15:42
Магический квадрат Гаджи Помощь студентам 5 24.10.2009 09:46