Ir para conteúdo
Fórum Script Brasil
  • 0

Problema Com Programa...


Arckyz

Pergunta

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?

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros 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??? )

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...