• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

sandro_G

Dêem-me luzes? lol

19 mensagens neste tópico

Boas..

Precisava que todos vos(crânios da programação) me dessem luzes de como fazer um programa em C que faça um sistema de encriptação por cifras de substituição. Trocando isto por miúdos, o que quero fazer é introduzir um texto em C e ele devolve-me o texto encriptado conforme as letras que eu definir para substituir... Espero que tenham percebido o que pretendo fazer... Entretanto vou tentando elaborar qualquer coisa...

Espero a ajuda :P

Abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cria um vector com a cifra, onde v[0] = letra que vai substituir o 'A', v[1] o 'B', etc.

De seguida, percorres todo o texto e fazes uma substituição directa.

O vector acima pode, ou ser hardcoded, ou ser o teu próprio programa a criar, se a cifra for uma rotação do alfabeto, por exemplo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cria um vector com a cifra, onde v[0] = letra que vai substituir o 'A', v[1] o 'B', etc.

De seguida, percorres todo o texto e fazes uma substituição directa.

O vector acima pode, ou ser hardcoded, ou ser o teu próprio programa a criar, se a cifra for uma rotação do alfabeto, por exemplo.

Não t importas de ser mais concreto sff...Já percebi alguma coisa, mas como faço o método de substituição???

Thanks pela ajuda...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

depois de criado o vector (acho que foi essa parte que percebeste), substituis cada letra no texto pela letra correspondente.

fazes um ciclo que percorra todo o texto, e em cada letra faço algo como str = v[str-'A'];

deste modo, sempre que ele encontrar uma letra de A..Z ele substitui pela correspondente no vector.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

depois de criado o vector (acho que foi essa parte que percebeste), substituis cada letra no texto pela letra correspondente.

fazes um ciclo que percorra todo o texto, e em cada letra faço algo como str = v[str-'A'];

deste modo, sempre que ele encontrar uma letra de A..Z ele substitui pela correspondente no vector.

Arranjei mais alguns problemas...Tipo sempre que escrevo um texto quando dou espaço o texto deixa de ser armazenado na string..Alguma solução pa isso?E tipo como faço a função para percorrer todo o meu texto????

Abraços e thanks pela ajuda que tas a dar..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem relativamente a parte do texto nao ficar quando dou espaço já resolvi esse problema...Agr só não sei como criar uma função para percorrer o texto e converte-lo....Help-me

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

depois de criado o vector (acho que foi essa parte que percebeste), substituis cada letra no texto pela letra correspondente.

fazes um ciclo que percorra todo o texto, e em cada letra faço algo como str = v[str-'A'];

deste modo, sempre que ele encontrar uma letra de A..Z ele substitui pela correspondente no vector.

Arranjei mais alguns problemas...Tipo sempre que escrevo um texto quando dou espaço o texto deixa de ser armazenado na string..Alguma solução pa isso?E tipo como faço a função para percorrer todo o meu texto????

Abraços e thanks pela ajuda que tas a dar..

Olá sandro_G...

Isso de sempre que escrevers um espaço ele deixar de armazenar é porque estás a usar o scanf("%s"); A solução que conheço é usares o gets(variavel_string);

Aproposito.. Também estou interessado nesse programa de cifra... Alguem que ajude porque eu nao sou grande cranio em manipular texto em c.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

depois de criado o vector (acho que foi essa parte que percebeste), substituis cada letra no texto pela letra correspondente.

fazes um ciclo que percorra todo o texto, e em cada letra faço algo como str = v[str-'A'];

deste modo, sempre que ele encontrar uma letra de A..Z ele substitui pela correspondente no vector.

Arranjei mais alguns problemas...Tipo sempre que escrevo um texto quando dou espaço o texto deixa de ser armazenado na string..Alguma solução pa isso?E tipo como faço a função para percorrer todo o meu texto????

Abraços e thanks pela ajuda que tas a dar..

Olá sandro_G...

Isso de sempre que escrevers um espaço ele deixar de armazenar é porque estás a usar o scanf("%s"); A solução que conheço é usares o gets(variavel_string);

Aproposito.. Também estou interessado nesse programa de cifra... Alguem que ajude porque eu nao sou grande cranio em manipular texto em c.

Pois quanto a cena do espaço tá resolvido, mas quanto a funçã que vai correr o texto é que já não faço ideia..:Vamos esperar que alguum cranio dê os seus palpites...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso de sempre que escrevers um espaço ele deixar de armazenar é porque estás a usar o scanf("%s"); A solução que conheço é usares o gets(variavel_string);

O gets() dá um WARNING por isso é melhor usar o fgets()!

fgets(buffer,100,stdin)

Pois quanto a cena do espaço tá resolvido, mas quanto a funçã que vai correr o texto é que já não faço ideia..:Vamos esperar que alguum cranio dê os seus palpites...

Não me considero nenhum crânio mas para isso tens de saber o tamanho da string. Para saber podes usar a função strlen() (procura como se usa GOOGLE IS YOUR FRIEND ;)).

Depois com um for para percorrer cada posição e em cada posição fazes uma coisa do tipo:

string1[i] = string2[i-'Z']

PS: O Z é uma letra que escolhi ao acaso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, usem o fgets em vez de gets, o gets pode levar a buffer overflow.

quanto a percorrer a string, é desnecessário achar o tamanho dela.

for (i=0;s[i]!='\0';i++)
  if ((s[i]>='A') && (s[i]<='Z')) s[i]=v[s[i]-'A'];

Isto partindo do principio que o vector v contem a nova cifra, substitui a letras 'A'..'Z'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, usem o fgets em vez de gets, o gets pode levar a buffer overflow.

quanto a percorrer a string, é desnecessário achar o tamanho dela.

for (i=0;s[i]!='\0';i++)
  if ((s[i]>='A') && (s[i]<='Z')) s[i]=v[s[i]-'A'];

Isto partindo do principio que o vector v contem a nova cifra, substitui a letras 'A'..'Z'.

Continuo sem perceber muito bem que vectores preciso de declarar...POr exemplo, no exemplo acima o que corresponde o "s" e o "v"...

Se poderes rsp agradeço...

Abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

s e v são duas strings que contém, correspondentemente, o texto a cifrar, e a cifra.

O formato da cifra já o expliquei lá em cima, mas de qualquer forma devias percebe-lo olhando para o código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo eu ainda tou no basico/medio de C, e ainda tou a aprender. Por isso é que não tou a ver o filme todo entendes?lol..Depois amanha eu vejo como avanço no programa.:Mas diz-me uma coisa..O grau de complexidade é muito ou medio??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Baixo.

for (i=0;s[i]!='\0';i++)
  if ((s[i]>='A') && (s[i]<='Z')) {
    temp=s[i]-'A';  
    s[i]=v[temp];
  }

Vê se simplifica.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Thanks pela info..Amanha vejo se ponho finalmente o programa a dar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Finalmente consegui!! :biggrin:

A unica forma de levar as minusculas a maiusculas foi a repetição do ciclo for, pois não consegui com o toupper..

Comentem o que tá menos bom.. Anexo o codigo para decifrar, mas vou fazer tb um programa..

Fica aqui o codigo, mas agr gostava de saber se há alguma forma de poder colar texto no executável (pelo menos no executave criado pelo turboc++4.5 da borland não dá):

#include <stdio.h>

int main()
{
char cifra[30];
int i=0;
char texto[1000];
cifra[0]= 'Z';
cifra[1]= 'Y';
cifra[2]= 'X';
cifra[3]= 'W';
cifra[4]= 'V';
cifra[5]= 'U';
cifra[6]= 'T';
cifra[7]= 'S';
cifra[8]= 'R';
cifra[9]= 'Q';
cifra[10]= 'P';
cifra[11]= 'O';
cifra[12]= 'N';
cifra[13]= 'M';
cifra[14]= 'L';
cifra[15]= 'que';
cifra[16]= 'J';
cifra[17]= 'I';
cifra[18]= 'H';
cifra[19]= 'G';
cifra[20]= 'F';
cifra[21]= 'E';
cifra[22]= 'D';
cifra[23]= 'C';
cifra[24]= 'B';
cifra[25]= 'A';
printf ("Digite o texto:\n");
fgets (texto,1000,stdin);
for (i=0;texto[i]!='\0';i++)
  if ((texto[i]>='A') && (texto[i]<='Z'))
  texto[i]=cifra[texto[i]-'A'];
for (i=0;texto[i]!='\0';i++)
  if ((texto[i]>='a') && (texto[i]<='z'))
  texto[i]=cifra[texto[i]-'a'];
printf ("O texto cifrado e:\n%s",texto);
return (0);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa cifra pode ser criada com um ciclo.

Em vez de cifra[..] = ..

Podes ter

for (i=0;i<26;i++) 
  cifra[i]='Z'-i;

E automaticamente removes essas linhas todas.

Depois, os teus dois fors, podem ser juntos num só, se alterares o if.

Não te vou fazer o trabalho todo, mas há duas maneiras.

- Tu queres trocar o caracter se ele estiver entre 'A' e 'Z' OU ... 

(depois também tens que ter cuidado de subtrair 'A' ou 'a' conforme o caso)

- Colocar dois ifs dentro do for, um para minusculas outro para maiusculas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa cifra pode ser criada com um ciclo.

Em vez de cifra[..] = ..

Podes ter

for (i=0;i<26;i++) 
  cifra[i]='Z'-i;

E automaticamente removes essas linhas todas.

Depois, os teus dois fors, podem ser juntos num só, se alterares o if.

Não te vou fazer o trabalho todo, mas há duas maneiras.

- Tu queres trocar o caracter se ele estiver entre 'A' e 'Z' OU ... 

(depois também tens que ter cuidado de subtrair 'A' ou 'a' conforme o caso)

- Colocar dois ifs dentro do for, um para minusculas outro para maiusculas.

Thanks pelas dicas construtivas...Assim que tiver tempo este fim de semana(que nao sei - lol) vejo isso, senao segunda...

Abraço

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora