Avatar billede refpsych Nybegynder
04. marts 2004 - 16:34 Der er 19 kommentarer og
2 løsninger

Chr/Ord function

Hej!

Jeg har lavet min eget CHR og ORD funktion for selv at kunne bestemme hvilke bogstaver de skal bruge. fx.
charMask  = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789';

Mit problem ligger i at når jeg laver en FOR sætning og kører alle bogstaverne igennem og pludser fx 100 til hver char og kører dem igennem igen og trækker 100 fra får jeg ikke det samme resultat ud som jeg startede med.
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789
abcdefghinklmnopqrstuvwxyAABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789
                        ^
Er der ongle der kan se hvad der er galt
Her er sourcen til dem:

var
  Form1: TForm1;
  characters : array[0..62] of char;
  codeCount, counter : integer;
  code : string;
  const charMask  = 'aabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789';


// Limited Char function

function lChar (num : integer) : char;
begin
characters := charMask;
  if num > 0 then
    begin
      if num > length(characters) then
        begin
          repeat
            num := num - (length(characters));
          until num < length(characters);
            result := characters[num];
        end
      else
        begin
          result := characters[num];
        end;
    end
    else
    begin
    if num < 0 then
        begin
          repeat
            num := num + (length(characters));
          until num > 0;

            result := characters[num];
        end
      else
        begin
          result := characters[num];
        end;
    end;
end;

// Function End

// Limited Ord Function

function lOrd(chara : char) : integer;
var
i : integer;
begin
characters := charMask;
  if chara <> '' then
    for i := 0 to length(characters) do
      begin
      if chara = characters[i] then
        begin
        Result := i;
        end;
      end;
end;
Avatar billede refpsych Nybegynder
04. marts 2004 - 16:37 #1
Pilen der viser fejlen har flyttet sig lidt fejlen er her:
uvwxyzABCD
uvwxyAABCD

Men der er forskelligt efter hvad tal jeg ligger til eller trækker fra...
Avatar billede arne_v Ekspert
04. marts 2004 - 16:42 #2
Husker du at bruge:

IChar((IOrd(c) + 100) mod length(charmask))
IChar((IOrd(c) - 100 + length(charmask)) mod length(charmask))

?
Avatar billede refpsych Nybegynder
04. marts 2004 - 17:19 #3
Jeg er ikke helt med på hvad du mener...
Avatar billede arne_v Ekspert
04. marts 2004 - 17:23 #4
Som jeg har skrevet.

Det er ikke bare +100 og -100 men en modulus og en ekstra +længde
Avatar billede refpsych Nybegynder
04. marts 2004 - 18:12 #5
jeg er desværre stadig ikke med. hvad er "en modulus"
og hvor er det du vil bruge +100 og -100 men en modulus og en ekstra +længde. i FOR sætningen?
Jeg er ikke en vildt god programmør... :)
Avatar billede arne_v Ekspert
04. marts 2004 - 18:17 #6
modulus er rest ved division
Avatar billede nca Juniormester
04. marts 2004 - 18:30 #7
I Charmask har du aa i begyndelsen.
Længden af dit array skal være 61, da det begynder med 0
Avatar billede refpsych Nybegynder
04. marts 2004 - 19:48 #8
Okay. det er rettet men den laver stadig fejl..

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789
bcdefghmjklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789
Avatar billede nca Juniormester
05. marts 2004 - 14:44 #9
Hvis du skrive koden til din test, vil jeg gerne afprøve programmet for dig.
Avatar billede hrc Mester
05. marts 2004 - 15:09 #10
Jeg har kigget din kode igennem og jeg fattede først O og en brik. Endte med ræsonnere mig frem til at det må være nogenlunde det samme som dette her:

const
  Characters : array[0..62] of char =
    'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789';

function lChr(aNum : integer) : char;
begin
  if aNum <= length(characters) then
    result := characters[aNum];
end;

// Limited Ord Function

function lOrd(aCh : char) : integer;
begin
  result := pos(aCh,Characters) - 1;
end;

Det giver stadigvæk ikke megen fornuft, for hvorfor vil du lægge 100 til og trække 100 fra? Idet du justerer aNum hvis karakteren er > lgd, så forvansker du bare dine data - her er ikke tale om kryptering.
Avatar billede nca Juniormester
05. marts 2004 - 16:30 #11
Der er indbygget en fejlmulighed i at dit array begynder med 0 og positionerne i din streng begynder med 1. Fx. er characters[0] ikke defineret. Iøvrigt er arrayet så vidt jeg kan se overflødigt.
Avatar billede refpsych Nybegynder
05. marts 2004 - 18:25 #12
HRC >> Ja det er meningen funktionerne skal bruges til at kryptere med og selvfølgelig vil jeg ikke bare ligge 100 til og trække 100 fra igen. Men der er jo ingen grund til at gøre det mere avanceret en højst nødvendigt, før jeg får selve funktionerne til at virke.
Grunden til at lChar funktionen er så lang er at hvis tallet der kommer ind fx er 14050 sakl den selv forkorte det ned til det er indenfor arrayets længde og selv rette hvis tallet er negativt.

Her er hele sourcen jeg bruger til at teste med:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Edit4: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  characters : array[0..61] of char;
  const charMask  = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789';

implementation

{$R *.dfm}
// Limited Char function

function lChar (num : integer) : char;
begin
characters := charMask;
  if num > 0 then
    begin
      if num > length(characters) then
        begin
          repeat
            num := num - (length(characters));
          until num < length(characters);
            result := characters[num];
        end
      else
        begin
          result := characters[num];
        end;
    end
    else
    begin
    if num < 0 then
        begin
          repeat
            num := num + (length(characters));
          until num > 0;

            result := characters[num];
        end
      else
        begin
          result := characters[num];
        end;
    end;
end;

// Function End

// Limited Ord Function

function lOrd(chara : char) : integer;
var
i : integer;
begin
characters := charMask;
  if chara <> '' then
    for i := 0 to length(characters) do
      begin
      if chara = characters[i] then
        begin
        Result := i;
        end;
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
Edit2.Text := '';
Edit3.Text := '';
for i := 1 to length(edit1.Text) do
begin
edit2.Text := edit2.Text + lchar(lord(edit1.text[i])+100);
end;
for i := 1 to length(edit2.Text) do
begin
edit3.Text := edit3.Text + lchar(lord(edit2.text[i])-100);
end;
end;
end.
Avatar billede refpsych Nybegynder
05. marts 2004 - 18:28 #13
HRC >> Forresten virkede din lOrd fuktion fint :) den er lidt smartere end min.
Avatar billede arne_v Ekspert
05. marts 2004 - 18:29 #14
Kryptering ?

Se det har jeg færdige eksempler på !
Avatar billede arne_v Ekspert
05. marts 2004 - 18:29 #15
program crypt;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function encrypt(tekst,kode:string):string;
var
  I: integer;
begin
  for I := 1 to length(tekst) do
  begin
    tekst[I] := chr(ord(tekst[I])+ord(kode[(I mod length(kode))+1]));
  end;
  result := tekst;
end;

function decrypt(tekst,kode:string):string;
var
  I: integer;
begin
  for I := 1 to length(tekst) do
  begin
    tekst[I] := chr(ord(tekst[I])-ord(kode[(I mod length(kode))+1]));
  end;
  result := tekst;
end;
var
  t : string;
begin
    t := 'Dette er en prøve';
    writeln(decrypt(encrypt(t, 'hemmeligt'), 'hemmeligt'));
    t := '';
    writeln(decrypt(encrypt(t, 'hemmeligt'), 'hemmeligt'));
end.
Avatar billede arne_v Ekspert
05. marts 2004 - 18:30 #16
program Crypt;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function encrypt(tekst,kode:string):string;

var
  I: integer;

begin
  for I := 1 to length(tekst) do
  begin
    tekst[I] := chr(32+((ord(tekst[I])-32)+(ord(kode[(I mod length(kode))+1])-32)) mod 96);
  end;
  result := tekst;
end;

function decrypt(tekst,kode:string):string;

var
  I: integer;

begin
  for I := 1 to length(tekst) do
  begin
    tekst[I] := chr(32+(96 + (ord(tekst[I])-32)-(ord(kode[(I mod length(kode))+1])-32)) mod 96);
  end;
  result := tekst;
end;

var
  t : string;

begin
    t := 'Dette er en proeve';
    writeln(t);
    writeln(encrypt(t, 'hemmeligt'));
    writeln(decrypt(t, 'hemmeligt'));
    writeln(decrypt(encrypt(t, 'hemmeligt'), 'hemmeligt'));
    writeln(encrypt(decrypt(t, 'hemmeligt'), 'hemmeligt'));
end.
Avatar billede refpsych Nybegynder
05. marts 2004 - 18:34 #17
Jo tak :) men krypteringen kan jeg godt selv klarer. meningen er at lChar/lOrd skal bruges til kun at enkryptere de bogstaver der er i arrayet så den fx ikke laver om på linieskift og andre tegn...
Avatar billede nca Juniormester
07. marts 2004 - 09:49 #18
Hvis du laver "characters : array[0..61] of char;" om til "characters : array[1..62] of char;" virker dit program :-)
Men der er masser af muligheder for optimering - men det var jo ikke det du bad om hjælp til.
Avatar billede refpsych Nybegynder
07. marts 2004 - 14:32 #19
Jeg får desværre stadig fejl når jeg lave det om...

Ind: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789
Ud:  abcdefghijklinopqrstuvwyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Edit4: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  codeCount, counter : integer;
  code : string;
  const characters : array[1..62] of char  = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','Y','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');

implementation

{$R *.dfm}
// Limited Char function

function lChar (num : integer) : char;
begin
  if num > 0 then
    begin
      if num > length(characters) then
        begin
          repeat
            num := num - (length(characters));
          until num < length(characters);
            result := characters[num];
        end
      else
        begin
          result := characters[num];
        end;
    end
    else
    begin
    if num < 0 then
        begin
          repeat
            num := num + (length(characters));
          until num > 0;

            result := characters[num];
        end
      else
        begin
          result := characters[num];
        end;
    end;
end;

// Function End

// Limited Ord Function

function lOrd(chara : char) : integer;
var
i : integer;
begin
result := pos(chara,Characters) ;
end;


procedure predefine;
begin
  // Predefined Variables (Reset)
  //----------
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
predefine;
Edit2.Text := '';
Edit3.Text := '';
for i := 1 to length(edit1.Text) do
begin
edit2.Text := edit2.Text + lchar(lord(edit1.text[i])+100);
end;
for i := 1 to length(edit2.Text) do
begin
edit3.Text := edit3.Text + lchar(lord(edit2.text[i])-100);
end;

end;

end.
Avatar billede hreiff Nybegynder
08. marts 2004 - 12:08 #20
Der er to fejl i seneste udgave:

1)
I din const character .... har du to 'Y' er (trykfejl)
Det første skal naturligvis rettes til 'U'

2)
I function lChar skal du rette følgende:
          until num < length(characters);
til
          until num <= length(characters);

Så virker det som det skal.

//hreiff
Avatar billede refpsych Nybegynder
08. marts 2004 - 15:33 #21
Super! Så var den der :) tak!!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester