Ir ao conteúdo
  • Cadastre-se
Josesousa

C Dificuldade em resolver Palindromo

Recommended Posts

Estou com dificuldade em resolver o exercicio de palindromo.

segua a pergunta: 8. Fac¸a um programa que dado uma string, retorne 1 se ela for pal´ındromo e 0 se ela nao for palındromo. Lembrando que: Um pal´ındromo e uma palavra que tenha a propriedade ´ de poder ser lida tanto da direita para a esquerda como da esquerda para a direita

.Ex.: Socorram-me, subi no onibus em Marrocos.////////// Anotaram a data da maratona////////

O codigo que eu fiz:::::::

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/*8. Faca um programa que dado uma string, retorne 1 se ela for palındromo e 0 se ela nao˜
for palındromo. Lembrando que: Um palındromo e uma palavra que tenha a propriedade
de poder ser lida tanto da direita para a esquerda como da esquerda para a direita.Ex.:
Socorram-me, subi no onibus em Marrocos.
Anotaram a data da maratona*/
main (){
    char frase[500], frase2[500];
    int i, j, cont=0, tam, tam2;

    printf("Informe a frase: ");
    gets(frase);
    tam=strlen(frase);

    for(i=0;i<tam;i++){
        if(frase[i]==' '){
            for(j=i;j<tam;j++){
                frase[j]=frase[j+1];
            }
        }
    }
    //puts(frase);
    for(i=0;i<tam;i++){
        strcpy(frase2, strrev(frase));
    }
    puts(frase2);
    /*if(stricmp(frase2, frase)){
        printf("Nao e palindromo!");
    }
    else{
        printf("E palindromo!");
    }*/
    tam=strlen(frase2);
    for(i=0, j=0;i<tam2, j<tam2;i++,j++){
        if(frase[i]==frase2[j]){
            cont++;
        }
    }
    if(cont==tam2){
        printf("E polindromo!");
    }
    else {
        printf("Nao e polindromo!");
    }

return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não basta espelhar pois letras minúsculas são diferentes de letras maiúsculas, precisa converter cada letra usando toupper() (para maíuscula) ou tolower() (para minúscula) da biblioteca <ctype.h>.

 

Também precisa eliminar pontuação e espaçamento, ou seja, apenas as letras devem restar. O modo que eu faço é copiar apenas as letras da frase para um novo vetor, já convertendo para maiúsculo ao copiar a letra. Aí depois pode espelhar e comparar o invertido com o normal.

 

E se também quiser lidar com remoção de acentuação também pode aumentar um pouco a complexidade.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/*8. Faca um programa que dado uma string, retorne 1 se ela for palındromo e 0 se ela nao˜
for palındromo. Lembrando que: Um palındromo e uma palavra que tenha a propriedade
de poder ser lida tanto da direita para a esquerda como da esquerda para a direita.Ex.:
Socorram-me, subi no onibus em Marrocos.
Anotaram a data da maratona*/
main (){
    char frase[500], frase2[500], frase1[500], frase22[500];
    int i, j, cont=0, tam, tam2;

    printf("Informe a frase: ");
    gets(frase);
    tam=strlen(frase);

    for(i=0;i<tam;i++){
        if(frase[i]==' '){
            for(j=i;j<tam;j++){
                frase[j]=frase[j+1]; // AQUI EU REMOVO OS ESPACOS
            }
        }
    }
    //puts(frase);
    for(i=0;i<tam;i++){
        frase1[i]=toupper(frase[i]); // AQUI EU MUDO TUDO PARA MAIUSCULO, APESAR DE TER O "stricmp"
    }
    puts(frase1);// mostro a frase para eu ver como estar

    for(i=0;i<tam;i++){
        strcpy(frase2, strrev(frase1)); // COPIO A FRASE 1 PARA A DOIS JA INVERTIDA E MAIUSCULA (ja que ja transformei)
    }
    puts(frase2);             // mostro ela para saber como estar
    /*if(stricmp(frase2, frase)){
        printf("Nao e palindromo!");
    }
    else{
        printf("E palindromo!");
    }*/
    tam2=strlen(frase2);
   /* for(i=0, j=0;i<tam2, j<tam2;i++,j++){
        if(frase1[i]==frase2[j]){
            cont++;
        }
    }
    if(cont==tam2){
        printf("E polindromo!");
    }
    else {
        printf("Nao e polindromo!");
    }*/
    if(strcmp(frase1, frase2)==0){   // ESTA MOSTRANDO QUE TUDO NAO E POLINDROMO :(
        printf("E polindromo");
    }
    else
        printf("Nao e polindromo");

return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Do modo que está ambos frase1 e frase2 estão sendo invertidos, também tem problema na remoção de espaços que está introduzindo caracteres na string.

 

Fiz algumas modificações, colocando para copiar apenas se for uma letra, e inverte apenas a frase2, e agora está funcionando (coloquei comentários nas alterações):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/*8. Faca um programa que dado uma string, retorne 1 se ela for palındromo e 0 se ela nao˜
for palındromo. Lembrando que: Um palındromo e uma palavra que tenha a propriedade
de poder ser lida tanto da direita para a esquerda como da esquerda para a direita.Ex.:
Socorram-me, subi no onibus em Marrocos.
Anotaram a data da maratona*/
int main () {
    char frase[500], frase2[500], frase1[500];
    int i, j, tam, tam2;

    printf("Informe a frase: ");
    scanf("%500[^\n]", frase);
    //gets(frase);
    tam=strlen(frase);
    
    //Não precisa remover espaços, pois vai copiar apenas letras
    /*
    for(i=0; i<tam; i++) {
        if(frase[i]==' ') {
            for(j=i; j<tam; j++) {
                frase[j]=frase[j+1]; // AQUI EU REMOVO OS ESPACOS
            }
        }
    }*/
    //puts(frase);
    for(i=0, tam2=0; i<tam; i++) {
        if ( isalpha(frase[i]) ) {  //Copia apenas se for uma letra
            frase1[tam2]=toupper(frase[i]); // AQUI EU MUDO TUDO PARA MAIUSCULO, APESAR DE TER O "stricmp"
            tam2++; //Conta o tamanho da frase1
        }
    }
    frase1[tam2] = '\0'; //Caractere nulo para indicar o fim da string
    puts(frase1);// mostro a frase para eu ver como estar

    for(i=0; i<tam; i++) {
        strcpy(frase2, frase1); // COPIO A FRASE 1 PARA A 2
        strrev(frase2); //INVERTE A FRASE 2
    }
    puts(frase2);             // mostro ela para saber como estar
    /*if(stricmp(frase2, frase)){
        printf("Nao e palindromo!");
    }
    else{
        printf("E palindromo!");
    }*/
    //tam2=strlen(frase2);
    /* for(i=0, j=0;i<tam2, j<tam2;i++,j++){
         if(frase1[i]==frase2[j]){
             cont++;
         }
     }
     if(cont==tam2){
         printf("E polindromo!");
     }
     else {
         printf("Nao e polindromo!");
     }*/
    if(strcmp(frase1, frase2)==0) {  // ESTA MOSTRANDO QUE TUDO NAO E POLINDROMO :(
        printf("E polindromo");
    }
    else
        printf("Nao e polindromo");

    return 0;
}

A função gets() foi abandonada/removida e não é recomendável usar por não ser segura, use fgets() no lugar dela.

Funções não padrão como a strrev() e a stricmp() podem não estar disponíveis em compiladores e bibliotecas diferentes, então é bom fazer sua própria implementação sem depender delas.

 

Este mesmo problema foi postado nesse outro tópico, dê uma olhada para ver soluções diferentes:

 

  • Curtir 1
  • Obrigado 1

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





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×