• Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   14-02-2016

      Prezados membros do Fórum do Clube do Hardware,

      Está aberto o processo de seleção de novos moderadores para diversos setores do fórum. Os requisitos são:
        Pelo menos 1000 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas ao formulário abaixo:    Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • Gabriel Torres

      Email de confirmação de cadastro com problemas   28-04-2016

      Estamos cientes deste problema e trabalhando para solucioná-lo: novos cadastros no Fórum não estão funcionando no momento, pois o email de confirmação de cadastro não é enviado. Esperamos ter este problema resolvido em no máximo 24 horas. Obrigado pela compreensão.
Ichibection

Criptografia

7 posts neste tópico

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

1 pessoa curtiu isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

1 pessoa curtiu isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

1 pessoa curtiu isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!


Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.


Entrar agora