Ir para conteúdo

  • Entrar usando o Facebook Entrar usando o Twitter Entrar usando o Windows Live Login com Steam Login com Google      Entrar   
  • Cadastre-se

Ícone Classificados

Adicionar um Anúncio

Redes Sociais

Membros mais bem avaliados

Membros VIP mais recentes


Foto
- - - - -

Criptografia


  • Por favor, faça o login para responder
6 respostas neste tópico

#1 Ichibection

Ichibection
  • Membros Juniores
  • 6 posts
  • Membro desde 22/04/2012
0
Neutra
  • Ali

Postado 22 de abril de 2012 - 13h35min

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?


#2 Simon Viegas

Simon Viegas
  • Moderadores
  • 1.576 posts
  • Membro desde 08/11/2007
215
Excepcional
  • Salvador, Bahia

Postado 22 de abril de 2012 - 19h54min

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

Att,
Simon Viegas
(EstilingueAtomico)
Achou que uma mensagem foi útil? Clique no CURTIR! (precisa está logando)
Meu PC:
Spoiler

#3 Ichibection

Ichibection
  • Membros Juniores
  • 6 posts
  • Membro desde 22/04/2012
0
Neutra
  • Ali

Postado 24 de abril de 2012 - 21h57min

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.


#4 Simon Viegas

Simon Viegas
  • Moderadores
  • 1.576 posts
  • Membro desde 08/11/2007
215
Excepcional
  • Salvador, Bahia

Postado 25 de abril de 2012 - 14h16min

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

Att,
Simon Viegas
(EstilingueAtomico)
Achou que uma mensagem foi útil? Clique no CURTIR! (precisa está logando)
Meu PC:
Spoiler

#5 Ichibection

Ichibection
  • Membros Juniores
  • 6 posts
  • Membro desde 22/04/2012
0
Neutra
  • Ali

Postado 25 de abril de 2012 - 19h25min

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.


#6 LNW

LNW
  • Membros Plenos
  • 1.619 posts
  • Membro desde 16/12/2011
446
Excepcional
  • Rio de Janeiro

Postado 25 de abril de 2012 - 20h12min

Ichibection,

O comando que você procura é o Continue.

Mas não chegaria ser necessário usá-lo para resolver esse problema (inclusive vai deixar o código confuso). Estruture melhor o seu IF / ELSE IF / ELSE como o Estilingue já salientou.



;)
LNW


#7 Ichibection

Ichibection
  • Membros Juniores
  • 6 posts
  • Membro desde 22/04/2012
0
Neutra
  • Ali

Postado 27 de abril de 2012 - 21h29min

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.






0 usuário(s) está(ão) lendo este tópico

0 membros, 0 visitantes, 0 membros anônimos