Jump to content

criptografia simples


Flames
 Share

Recommended Posts

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define Max 10
void maiscmins(char str[]);
void incript(char str[],char lista1[],char lista2[]);
int main()
{
    char str[Max+1];
    char lista1[26]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char lista2[26]="DEIABCFGHJKLZYXWVUTSRQPONM";
    fgets(str,Max+1,stdin);
    maiscmins(str); /*passagem para maiusculas*/
    incript(str,lista1,lista2);

return 0;
}
void maiscmins(char str[]){
    int i=0;
    while(str[i]!='\0'){
        if (str[i] >= 'a' && str[i] <= 'z')
            str[i]= str[i] - 'a'+'A';
        i++;
    }
}

void incript(char str[],char lista1[],char lista2[]){
    int i=0;
    int j; /*percorrer as letras dos arrays encriptados*/
    while(str[i]!='\0'){
        for (j=0;j<26;j++){
            if(str[i]==lista1[j]){
                str[i]=lista2[j];
            }
        }
    i++;
    }
    printf("%s",str);
    printf("%s",lista1);
}
/*ABCDEFGHIJKLMNOPQRSTUVWXYZ
                                 to
   DEIABCFGHJKLZYXWVUTSRQPONM*/


A passagem da criptografia está a falhar e nem me vem a ideia porque o A em vez de assumir D está a assumir A e por ai fora alguem consegue explicar o porquê? Ou tentar levar-me a esse destino?

Link to comment
Share on other sites

não vi bem o código mas altera isto :

for (i = 0; i < strlen(str); i++)
  str[i] = lista2[str[i] - 'A'];

duas linhas de código e tens a alteração da string sem sequer usar lista1

podendo ficar assim :

void maiscmins(char str[]);
void incript(char str[]);

int main()
{
  char str[Max+1];
  fgets(str,Max+1,stdin);
  maiscmins(str);
  incript(str);

  return 0;
}

void maiscmins(char str[]){
  int i=0;
  for(i = 0; i < strlen(str); i++) {
    if (str[i] >= 'a' && str[i] <= 'z')
      str[i]= str[i] - 'a'+'A';
  }
}

void incript(char str[]){
  int i=0;
  char lista="DEIABCFGHJKLZYXWVUTSRQPONM";

  for (i = 0; i < strlen(str); i++)
    str[i] = lista[str[i] - 'A'];
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

O problema com o teu código é no ciclo que "encripta":

depois de mudares uma letra não terminas o ciclo e continuas a procurar letras para mudar.

Assim, para a letra A, o ciclo substitui por D mas continua a pesquisar ... até encontrar um D que substitui por A.


int main()
{
    char str[Max+1];
    char lista1[26]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

ATENÇÃO: lista1 não é uma string.

Para ser uma string tem de incluir um '\0' num dos elementos. Como tens lá as 26 letras do alfabeto não tens espaço para o '\0'.

void incript(char str[],char lista1[],char lista2[]){
    /* ... */
    printf("%s",lista1);

E este uso de lista1 assume, erradamente, que lista1 é uma string.

Sugestão: deixa o compilador calcular o tamanho dos arrays

    char lista1[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Com este código, lista1 terá 27 elementos e incluirá o '\0';

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

não vi bem o código mas altera isto :

for (i = 0; i < strlen(str); i++)
  str[i] = lista2[str[i] - 'A'];

duas linhas de código e tens a alteração da string sem sequer usar lista1

podendo ficar assim :

void maiscmins(char str[]);
void incript(char str[]);

int main()
{
  char str[Max+1];
  fgets(str,Max+1,stdin);
  maiscmins(str);
  incript(str);

  return 0;
}

void maiscmins(char str[]){
  int i=0;
  for(i = 0; i < strlen(str); i++) {
    if (str[i] >= 'a' && str[i] <= 'z')
      str[i]= str[i] - 'a'+'A';
  }
}

void incript(char str[]){
  int i=0;
  char lista="DEIABCFGHJKLZYXWVUTSRQPONM";

  for (i = 0; i < strlen(str); i++)
    str[i] = lista[str[i] - 'A'];
}

Tens razao era só fazer o calculo pela tabela ascii e dava-me automaticamente o numero do "index" a substituir nunca pensei nisso :S o que torna inutil o primeiro array thanks 😁

Link to comment
Share on other sites

O problema com o teu código é no ciclo que "encripta":

depois de mudares uma letra não terminas o ciclo e continuas a procurar letras para mudar.

Assim, para a letra A, o ciclo substitui por D mas continua a pesquisar ... até encontrar um D que substitui por A.


ATENÇÃO: lista1 não é uma string.

Para ser uma string tem de incluir um '\0' num dos elementos. Como tens lá as 26 letras do alfabeto não tens espaço para o '\0'.

E este uso de lista1 assume, erradamente, que lista1 é uma string.

Sugestão: deixa o compilador calcular o tamanho dos arrays

    char lista1[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Com este código, lista1 terá 27 elementos e incluirá o '\0';

Pmg tens razao eu nao tinha reparado xD ele substituia o A por D e depois o D por A LOOOOOOOL!!!!!!!!!!!!!!!!!!!!!!

ou fazia um break nessa zona ou entao usando o algoritmo do happyhippyhippo

thanks 😁

ps: aquilo do 26 mais uma vez com razao só meti a ver o que dava...

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.