IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Решётка Кардано, Проблема с выводом
cooler
сообщение 14.03.2010 13:35
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 178
Пол: Мужской

Репутация: -  0  +


Вот решил сделать в Delphi
Но почему-то выводит неправильный результат в форму, либо обрезает, либо выдаёт в не той кодировке
Чувствуется где-то ошибка в выводе
Подскажите
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
	Button1: TButton;
	Edit1: TEdit;
	Memo1: TMemo;
	Label5: TLabel;
	Edit2: TEdit;
	Label1: TLabel;
	Label2: TLabel;
	Button2: TButton;
	Button3: TButton;
	Button4: TButton;
	Button5: TButton;
	procedure Button1Click(Sender: TObject);
	procedure Button2Click(Sender: TObject);
	procedure Button3Click(Sender: TObject);
	procedure Button4Click(Sender: TObject);
	procedure Button5Click(Sender: TObject);
  private
	{ Private declarations }
  public
	{ Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  n = 8;
type
  sType = string[n];
  matrix = array[1 .. n] of sType;
const
  mask: matrix = (
	'x...x...',
	'.x...x..',
	'..x...x.',
	'...x...x',
	'..x...x.',
	'...x....',
	'x...x..x',
	'..x..x..'
  );


var
  st:string;


  encoded: matrix;
  masked: matrix;

{ поворот матрицы }
procedure T(var res: matrix);
var
  i, j: integer;
  mx: matrix;
begin
  mx := res;
  for i := 1 to n do
	for j := 1 to n do
	  res[j, n - i + 1] := mx[i, j];
end;

{ зашифровка текста }
procedure EncodeText(const s: string;
		  const mask: matrix; var mx: matrix);
var
  i, j, count: integer;
  masked: matrix;
begin
 for i := 1 to n do mx[i]:=#0;

{ Заполнение матрицы mx строками по N пробелов }
  for i := 1 to n do
	for j := 1 to n do mx[i] := mx[i]+ '_';



  masked := mask;
  count := 1;
  while count <= length(s) do begin

	for i := 1 to n do
	  for j := 1 to n do
		if masked[i, j] = 'x' then begin
		  mx[i][j] := s[count];
		  inc(count)
		end;
	T(masked);

  end;
end;

{расшифровка текста}
function DecodeText(const mask, encoded: matrix): string;
var
  s: string;
  i, j, count: integer;
  masked: matrix;
begin

  masked := mask;
  count := 0; s := ' ';
  while length(s) < n*n do begin
	for i := 1 to n do
	  for j := 1 to n do
		if masked[i, j] = 'x' then s := s + encoded[i, j];
	T(masked);
  end;
  DecodeText := s;

end;
var
  i: integer;
begin
  memo1.Lines.Clear;
  st:=edit2.text;
  EncodeText(st, mask, encoded);
  for i := 1 to 8 do begin
  memo1.lines.add(encoded[i]);
  end;
edit1.text:=DecodeText(mask, encoded);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit2.Text:='';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
form2.showmodal;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
form3.showmodal;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
memo1.Clear();
edit1.Text:='';
end;

end.


Сообщение отредактировано: volvo - 5.04.2010 15:32


Прикрепленные файлы
Прикрепленный файл  Cardano.rar ( 6.04 килобайт ) Кол-во скачиваний: 262
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 2)
volvo
сообщение 14.03.2010 14:06
Сообщение #2


Гость






Цитата
Чувствуется где-то ошибка в выводе
dry.gif

Ошибок в выводе нет. Ошибка у тебя в голове. С какого перепуга ты обрезаешь входную строку, ограничивая ее 24 символами? Ты у меня на сайте это ограничение видел? Нет. Вот и не ограничивай. А то перековеркают все что можно, а потом им "в выводе проблема".

Это было первое. А второе - Дельфи и Паскаль - это вообще-то разные языки, тебе не кажется? В Паскале строка string[n] - это одно, в Дельфи - другое (не надо путать String, ShortString и AnsiString - это приводит вот к таким постам, как твой). В Дельфи 2009/2010 код вообще не компилируется, чтоб работало - надо сделать так:

type
  sType = String; // [n]; 

...
procedure EncodeText(const s: string;
          const mask: matrix; var mx: matrix);
var
  i, j, count: integer;
  masked: matrix;
begin
 for i := 1 to n do begin
   SetLength(mx[i], n);
   mx[i] := '';
   // mx[i]:=#0;
 end;
...
, тогда программа запускается и выдает:
Прикрепленное изображение
(Edit2.MaxLength сброшено в 0, если что). Что обрезается? Какая не та кодировка?
 К началу страницы 
+ Ответить 
cooler
сообщение 14.03.2010 14:11
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 178
Пол: Мужской

Репутация: -  0  +


Спасибо большое smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 23.07.2025 14:18
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"