Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×