• 0
Sign in to follow this  
Arckyz

Problema Com Programa...

Question

Olá, sou novo no forum e estou com uma duvida em um programa que estou montando.

Estou fazendo um programa que criptografa falguam frase escrita.

em si o programa pega a frase dividi dentro de um array cada letra, pega o numero ASCII de cada letra e adiciona um numero a mais para mudar as letras para simbolos...

so que eu so conheco a função COPY para pegar letras de uma frase, e ela so aceita variaveis do tipo string, e a funcao para mudar a letra para codigo ASCII (ord/chr) só aceitam variaveis do tipo char... a baixo estou colocando o codigo fonte de ate onde chegei

procedure TForm1.btn_criptografarClick(Sender: TObject);

var

frase: array [1..50] of string;

ordem: array [1..50] of integer;

x:integer;

begin

x:=0;

repeat

x:=x+1;

frase[x]:=copy(txt_frase.text,x,1);

until x = 50;

x:=0;

repeat

x:=x+1;

ordem[x]:= ord(frase[x]);

ordem[x]:=ordem[x] + 45;

frase[x]:= chr(ordem[x]);

until x = 50;

x:=0 ;

repeat

x:=x+1;

txt_crip.text := txt_crip.text + frase[x];

until x = 50;

end;

end.

então se colocar o codigo para rodar ele dara um erro nessa parte

repeat

x:=x+1;

"""ordem[x]:= ord(frase[x]);"""

frase[x]:= chr(ordem[x]);

until x = 50;

dizendo que são do tipo incopativeis...

então alguém tem alguma ideia de como arrumar ou mudar o codigo para que funcione?

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 0
então se colocar o codigo para rodar ele dara um erro nessa parte

repeat

x:=x+1;

"""ordem[x]:= ord(frase[x]);"""

Arckyz, ocorre que você definiu Frase como sendo um array de String, enquanto o função Ord deve receber um Char como parâmetro.

então alguém tem alguma ideia de como arrumar ou mudar o codigo para que funcione?
so que eu so conheco a função COPY para pegar letras de uma frase, e ela so aceita variaveis do tipo string, e a funcao para mudar a letra para codigo ASCII (ord/chr) só aceitam variaveis do tipo char...
Não é bem assim, desde que você tenha certeza de que Copy retornará uma string válida(no seu caso um caracter), você pode indexar o resultado e acessar apenas um caracter:
var
  Caracter :Char;
begin
  Caracter := Copy(txt_frase.text,x,1)[1];
Com isto, redefinindo Frase para array de char, acho que você consegue resolver seu problema. Mas, como estou meio desocupado :D, vou tomar a liberdade de sugerir uma alternativa, beleza?! Considerando que sua frase criptografada terá sempre 50 caracteres, independente o tamanho da frase inicial, vamos estabelecer uma constante para controlar este parâmetro. Caso você venha a mudar este tanhanho, fará em um único lugar. Para facilitar as operações que você implementa, vamos definir Frase como sendo um array de Char (buffer a ser tratado como um PChar). Então, esta parte do código:
var
  frase: array [1..50] of string;
  ordem: array [1..50] of integer;
  x:integer;
begin
  x:=0;
  repeat
    x:=x+1;
    frase[x]:=copy(txt_frase.text,x,1);
  until x = 50;
obs: da forma como está definida este fragmento, você corre o risco de obter um erro de execução, pois está copiando 50 posições de txt_frase, sendo que provavelmente não há garantias de que esta seja a quantidade de caracteres encontrada nele. Ficaria assim:
const
  StrSize = 50;
var
  X :Integer;
  Frase :array[1..StrSize +1] of char;
begin
  FillChar(Frase, SizeOf(Frase), 0);
  StrPCopy(@Frase, txt_frase.Text);
FillChar inicializará todo o array com o caracter #0 (último parâmetro). Já StrPCopy, copia um String para um buffer PChar (o @ informa o endereço do início do buffer). Frase é definida com o tamanho StrSize +1 porque um PChar é terminado pelo caracter #0 - então devemos reservar este espaço. Esta parte do código poderá ser executada em apenas uma passada então e utilizando o array inicial
  x:=0;
  repeat
    x:=x+1;
    ordem[x]:= ord(frase[x]);
    ordem[x]:=ordem[x] + 45;
    frase[x]:= chr(ordem[x]);
  until x = 50;
Ficando simplesmente:
  for x := 1 to StrSize do
    Frase[x] := Char((Ord(Frase[x]) +45));
Ou ainda, não utilizando funções, mas sim type-cast, poderíamos "dizer" para que o compilador tratasse Frase[x] (Char) como se fosse do tipo Byte (são compatíveis em tamanho), ficaria assim:
  for x := 1 to StrSize do
    Byte(Frase[x]) := Byte(Frase[x]) +45;
Para retornar o resultado, basta converter devolta Frase(PChar) para String, não sendo necessário a concatenação caracter-a-caracter:
  x:=0;
  repeat
    x:=x+1;
    txt_crip.text := txt_crip.text + frase[x];
  until x = 50;
end;
Fazendo-se uso da função StrPas que executa o processo de conversão:
  txt_crip.text := StrPas(@Frase);
end;

[]s

Share this post


Link to post
Share on other sites
  • 0

muito obrigado micheus, realmente eu não conehci quase nenhuma dessas funcoes que você me mostrou, estou estudando delhpi a cerca de 3 meses so :P, mas consegui inteder quse tdo e o que não intendi fiquei com um boa ideia!!

muito obrigado caro, muito mesmo..

mas so uma coisa se podia me da uma explicao mais complexa sobre essa parte?

const

StrSize = 50;

var

X :Integer;

Frase :array[1..StrSize +1] of char;

(ela por acaso está definindo um tamanho, e colocando "Frase :array[1..StrSize+1] of char" eu estaria dizendo que o array vai ate 50 +1 ?? ou seja 51??)

--

também não compreendi 100% o

FillChar(Frase, SizeOf(Frase), 0);

( não intendi a parte do SizeOf(frase) o que ele quer dizer?? que toda a array frase sera preenchida, isso??)

e também o

txt_crip.text := StrPas(@Frase);

( não intendi também muito bem, o StrPas(@frase) seria a mesmo coisa que a concatenacao de toda a array frase??? )

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this