Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

linally

Decodificar uma palavra - C

Recommended Posts

Será que vocês podem me ajudar a encontrar onde estou errando ??

 

Reescrever uma string S1, substituindo os caracteres contidos na string S2 pelo caracter encontrado na mesma posição numa string S3. Por exemplo, se S1 = "batata", S2 = "abc" e S3 = "xyz", isso quer dizer que "a" deve ser substituido por "x", "b" deve ser trocado por "y" e "c" será reescrito como "y". O resultado seria "yxtxtx". Você consegue pensar em uma forma fácil de fazer a "decodificação" dessa string?

(deve-se fazer em forma de função)

E meu programa ficou assim:

 

 

int decodifica(char c,char s1[],char s2[]){
    int tam=strlen(s1),j=-1,i;
    char resp;
    for(i=0;i<tam;i++){
        if(s1[i]==c)
            j=i;
    }
    if(j==-1)
        resp=c;
    else
        resp=s2[j];
    return resp;
}
 
int main(){
    char s1[6],s2[3],s3[3],c;
    int i;
    printf("Digite a string s1:");
    gets(s1);
    printf("Digite a string s2:");
    gets(s2);
    printf("Digite a string s3:");
    gets(s3);
    for(i=0;i<strlen(s1);i++){
        s1[i]=decodifica(c,s1,s2);
    }
    printf("A nova string eh:");
    for(i=0;i<strlen(s1);i++){
        printf("%s",s1[i]);
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

resp é uma variável do tipo char e na função você está retornando ela como int? ps: Você está salvando uma string em 1 char e retornando ele.

 

No if:

if(s1[i]==c)

quando estiver comparando uma variável do tipo char, use:

if( s1[i] == 'c' )

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Penso que você está errando em quase tudo.

 

s1 deve ser verificada caractere por caractere até que todos sejam lidos, ou seja, até encontrar o caractere nulo ('\0' ou 0). Assim temos:

while(s1 != '\0')
{
    s1++;
}

 

Todos os caracteres de s1 que estiverem presentes em s2 devem ser substituídos pelos de s3. Como agora já podemos tratar s1 como um caractere, dentro do laço while, basta determinar se há uma ocorrência e se houver a posição desta em s2. Procurar um caractere em uma string, isto faz você pensar em qual função? Claro, strchr. Então agora nosso código será:

 

char* p;

while(s1 != '\0')
{
    p = strchr(s2, *s1);

    if(p != NULL);

    s++;
}

 

Agora é só substituir o caractere encontrado em s2 pelo em s3 correspondente e atribuir seu valor à s1, mas ainda não podemos usar o ponteiro p como indicador da posição do caractere em outra string, precisamos transforma-lo em um inteiro. Como strchr retornou s2 + posição do caractere, basta usar a aritmética de ponteiros, ou seja, p - s2. Agorá só é necessário atribuir a s1 o caractere da posição p - s2 de s3:

char* p;

while(s1 != '\0')
{
    p = strchr(s2, *s1);

    if(p != NULL)
        *s1 = s3[p - s2];

    s++;
}

 

Agorá só falta transformar este código em uma função:

 

void
nome_da_funcao (char* s1, const char* s2, const char* s3)
{
    char* p;
    
    while(*s1 != '\0')
    {
        p = strchr(s2, *s1);
        
        if(p != NULL)
            *s1 = s3[p - s2];
        s1++;
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Penso que você está errando em quase tudo.

 

s1 deve ser verificada caractere por caractere até que todos sejam lidos, ou seja, até encontrar o caractere nulo ('\0' ou 0). Assim temos:

while(s1 != '\0')
{
    s1++;
}

 

Todos os caracteres de s1 que estiverem presentes em s2 devem ser substituídos pelos de s3. Como agora já podemos tratar s1 como um caractere, dentro do laço while, basta determinar se há uma ocorrência e se houver a posição desta em s2. Procurar um caractere em uma string, isto faz você pensar em qual função? Claro, strchr. Então agora nosso código será:

 

char* p;

while(s1 != '\0')
{
    p = strchr(s2, *s1);

    if(p != NULL);

    s++;
}

 

Agora é só substituir o caractere encontrado em s2 pelo em s3 correspondente e atribuir seu valor à s1, mas ainda não podemos usar o ponteiro p como indicador da posição do caractere em outra string, precisamos transforma-lo em um inteiro. Como strchr retornou s2 + posição do caractere, basta usar a aritmética de ponteiros, ou seja, p - s2. Agorá só é necessário atribuir a s1 o caractere da posição p - s2 de s3:

char* p;

while(s1 != '\0')
{
    p = strchr(s2, *s1);

    if(p != NULL)
        *s1 = s3[p - s2];

    s++;
}

 

Agorá só falta transformar este código em uma função:

 

void
nome_da_funcao (char* s1, const char* s2, const char* s3)
{
    char* p;
    
    while(*s1 != '\0')
    {
        p = strchr(s2, *s1);
        
        if(p != NULL)
            *s1 = s3[p - s2];
        s1++;
    }
}

 

Então , o problema é que eu não posso utilizar essa função strchr , pois nao me foi explicada em aula, eai o professor não aceita :/

Tentei utilizar a logica que voce explicou, mas ainda não funciona !!

 

 

int procura(char s1[],char s2[]){
    int j,resp=-1,i;
    for(j=0;j<strlen(s1);j++){
        for(i=0;i<strlen(s2);i++){
            if(s1[j]==s2[i]){
                resp=i;
        }}
    }
    return resp;
}
char decodifica(char s1[],char s2[],char s3[]){
    int i=procura(s1,s2),resp;
    if(i!=-1){
        s1[i]=s3[i];
        resp=s1[i];
    }
    return resp;
}
 
int main(){
    char s1[6],s2[3],s3[3],c;
    int i;
    printf("Digite a string s1:");
    gets(s1);
    printf("Digite a string s2:");
    gets(s2);
    printf("Digite a string s3:");
    gets(s3);
    for(i=0;i<strlen(s1);i++){
        c=s2[i];
        s1[i]=decodifica(s1,s2,s3);
    }
    printf("A nova string eh:");
    for(i=0;i<strlen(s1);i++){
        printf("%c",s1[i]);
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou-te dar alguns conselhos:

  1. Use uma indentação mais eficaz, no início isto ajuda muito a entender o código.
  2. Pense em como seu programa está agindo.
  3. Tente criar seus códigos passo a passo, ou seja, o que deverá ser feito primeiro e depois?
  4. Quando estiver fazendo um código, se ainda estiver aprendendo, se possível, quando errar, reescreva o código do zero e reflita na causa do erro. Quando se sentir mais preparado tente concertar seu erro, de maneira alguma desista.
  5. Use as mensagens do compilador, quando este for o caso, para ajudar a entender o motivo do erro.
  6. Se estiver usando o GCC, use -Wall, isto mostrará qualquer coisa errada no seu código, ou seja, erros "bobos" que muitas vezes não causam problemas, mas que devem ser evitados, como variáveis não usadas. Em programas pequenos estes erros são desprezíveis, mas é claro que você não quer escrever apenas programinhas pequenos, porém quer escrever programas imensos, onde estes erros "bobos" podem se transformar em catástrofes.

 

Por favor, compare a correção com seu código.

#include <stdio.h>
#include <string.h>

int procura(char s1,char s2[])
{
    int resp = -1, i;
    
    for(i = strlen(s2); i >= 0; i--)
        if(s1 == s2[i])
            resp = i;

    return resp;
}

char decodifica(char s1, char s2[], char s3[])
{
    int i = procura(s1, s2);
    
    if(i != -1)
        s1 = s3[i];
    
    return s1;
}
 
int main()
{
    char s1[256], s2[256], s3[256];
    int i;
    
    printf("Digite a string s1:");
    fgets(s1, 256, stdin);
    
    printf("Digite a string s2:");
    fgets(s2, 256, stdin);
    
    printf("Digite a string s3:");
    fgets(s3, 256, stdin);
    
    for(i = strlen(s1); i >= 0; i--)
        s1[i] = decodifica(s1[i], s2, s3);
    
    printf("A nova string eh: %s\n", s1);
    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.