Jump to content

Recommended Posts

Posted
#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?

Posted

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
Posted

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!

Posted

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 😁

Posted

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...

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
×
×
  • 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.