Ir ao conteúdo
  • Cadastre-se

Criptografia


Visitante: Ichibection

Posts recomendados

Visitante: Ichibection
 

2.19 – Escrever um programa para criptografar um texto com N caracteres e codifica-lo usando as seguintes regras:

a) Substituir toda vogal encontrada pela 2ª vogal consecutiva;

Ex.: a => i; e => o; i => u; o => a; u = e.

B) Substituir toda a ocorrência de:

ch => x1; lh => x2; nh => x3; br => y 1; cr => y2; dr => y3; gr => y4; pr => y5;

tr => y6.

Imprimir o texto inicial, o codificado e o texto decodificado.

Tentei fazer a letra a) meu código ficou assim:

program pg219;

uses crt;

var

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

n,c,con:integer;

palavra:string;

begin

con:=0;

writeln('Digite a palavra a ser criptografada');

readln(palavra);

n:=length(palavra);

for c:=1 to n do

x[c]:=palavra[c];

for c:=1 to n do

write(x[c],' '); writeln;

for c:=1 to n do begin

if x[c] = 'a' then begin

x[c]:='i';

end;

if x[c] = 'e' then begin

x[c]:='o';

end;

if x[c] = 'i' then begin

x[c]:='u';

end;

if x[c] = 'o' then begin

x[c]:='a';

end;

if x[c] = 'u' then begin

x[c]:='e';

end;

end;

for c:=1 to n do

write(x[c],' ');

readKey;

end.

O problema é que ele substitui o caractere q ele já alterou fazendo com q o resultado saia incorreto. Alguem tem alguma ideia?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá Ichibection,

O problema é que ele substitui o caractere q ele já alterou fazendo com q o resultado saia incorreto. Alguem tem alguma ideia?

Para resolver esse problema, basta transformar os ifs simples em if/else, ou, usar case no lugar dos ifs.

O que está ocorrendo é que ao modificar um valor, o código ainda continua verificando as outras possibilidades (não deveria). E a variável da condição dos ifs é justamente a que está sendo alterada, logo, pode ocorrer de ser alterado na condição a cima, e logo depois, com o novo valor, ser alterado novamente.

Logo, os if/elses resolvem as duas questões:

1) Se uma condição for verdadeira, para de verificar;

2) Corrige esse "erro de lógica", porque, mesmo se não tivesse dando erro, não deveria continuar verificando, já que "nunca poderia ter duas respostas verdadeiras" (são condições mutualmente exclusivas entre si - para esses casos "devem" usar o else).

PS1: A variável x poderia ser do tipo char, em vez de string, já que só tem um caractere.

PS2: As strings no Pascal se comportam como um array[1..255] of char, ou seja, dá para acessar a posição da letra da mesma forma como se acessa a posição de uma array. Ex.:

if palavra[c] = 'a' then

PS3: Uma forma simples de corrigir, seria usar justamente no if a variável palavra. Só isso! Desta forma o valor usado na condição sempre seria o mesmo para cada loop do for, sendo assim, só uma condição seria verdadeira (problema resolvido?). Não, pois continuaria com o tal erro de lógica, já que não faz sentido verificar todos os ifs posteriores!!! Entende? Logo, a melhor solução é usar if/elses ou um case!!!

Abraços

Link para o comentário
Compartilhar em outros sites

Visitante: Ichibection
 

valeu mesmo EstillingueAtomico. Depois posto aqui o resultado.

Tem algum comando em Pascal que repete a condição for com um incremento? Porque no pascal o end; fecha qualquer comando e não tenho como fechar especificamente o for.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
valeu mesmo EstillingueAtomico. Depois posto aqui o resultado.

beleza então... fico no aguardo.

Tem algum comando em Pascal que repete a condição for com um incremento? Porque no pascal o end; fecha qualquer comando e não tenho como fechar especificamente o for.

Não é bem assim... o end está sempre vinculado a um begin (ou a um case -_-). O begin/end é uma estrutura que serve para agrupar mais de um comando em "grupo", assim, sendo possível vincular-los a um outro comando que, por definição, "só se agrupa a uma coisa". Ex.: O if, while, for, with etc, só vinculam a ele o comando que vem depois (a "próxima linha"), daí, caso queira vincular mais de um comando, usam-se o begin/end, ou seja, em vez de executar um comando, vai executar um bloco.

Ex.:

if x[c] = 'a' then
x[c]:='i';

Não precisa de begin/end (é facultativo), pois é um só comando que vai ser executado se a condição for verdadeira.

if x[c] = 'a' then
[COLOR="Red"] begin[/COLOR]
writeln('A letra "a" foi alterada!!!');
x[c]:='i';
[COLOR="Red"] end;[/COLOR]

Nesse caso, tem duas linhas vinculadas (mais de uma) ao if, logo, precisa de um begin/end... pois o if só se atrela a próxima linha... nesse caso um "begin".. e esse begin vai agrupar tudo que estive até o próximo end;... ^_^

É simples: cada end será sempre vinculado ao o begin acima mais próximo..

Ex.:

begin //1
begin //2
begin //3
begin //4
begin //5
begin //6

end; //6
end; //5
end; //4
end; //3
end; //2
end; //1

Não importa o comando que esse begin/end vai funcionar... a lógica é a mesma!! Na prática, é associado de dentro para fora!

Qualquer coisa é só postar

Link para o comentário
Compartilhar em outros sites

Visitante: Ichibection
 

Ainda não respondeu minha pergunta, acho q você n entendeu. Por exemplo:

for c:=1 to n do begin

if x[c] = 'a' then begin

x[c]:='i';

end;

if x[c] = 'e' then begin

x[c]:='o';

end;

if x[c] = 'i' then begin

x[c]:='u';

end;

if x[c] = 'o' then begin

x[c]:='a';

end;

if x[c] = 'u' then begin

x[c]:='e';

end;

Nesse caso teria algum modo de eu conseguir repetir o for q inicialmente foi 1 dentro de um if? Se eu usar o (break) ele quebra o for. Mas queria saber se existe tipo assim um (end) dentro de um if que repetisse o for já com c=2, como acontece ao chegar no end em negrito, se é q me entende. Questão bem chatinha essa.

Link para o comentário
Compartilhar em outros sites

Visitante: Ichibection
 

Nem tinha percebido que poderia usar else if, pensei que não era permitido no Pascal. Que besteira. Mas só praticando que se aprende. Taí o código da letra a) prontinho. valeu EstilingueAtomico e LNW pela ajuda

program pg219;

uses crt;

var

x:array[1..50] of char;

n,c:integer;

palavra:string;

begin

writeln('Digite a palavra a ser criptografada');

readln(palavra);

n:=length(palavra);

for c:=1 to n do

x[c]:=palavra[c];

for c:=1 to n do

write(x[c],' '); writeln;

for c:=1 to n do begin

if x[c] = 'a' then

x[c]:='i'

else

if (x[c] = 'e') then

x[c]:='o'

else

if (x[c] = 'i') then

x[c]:='u'

else

if (x[c] = 'o') then

x[c]:='a'

else

if (x[c] = 'u') then

x[c]:='e'

end;

for c:=1 to n do

write(x[c],' ');

readKey;

end.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...