Ir ao conteúdo

Posts recomendados

Postado

Olá gente, tudo bem. Antes de realizar o post pesquisei aqui, mas minha dúvida em específico ainda não foi abordada. Segue a questão: 

 

Um palíndromo é uma palavra ou frase que tenha a propriedade de poder ser lida tanto da direita para a esquerda como da esquerda para a direita. Por exemplo, as strings "aaaaa", "1221", "bbaabb" são palíndromos, entretanto a string "chef" não é um palíndromo porque se lermos da direita para a esquerda, obtemos "fehc" que não é a mesma coisa que "chef".

Ignore as diferenças entre maiúsculas e minúsculas.

Para os casos onde é dada uma frase, você deve ignorar os espaços. Por exemplo, a frase "A base do teto desaba" é considerada um palíndromo. Ao lê-la da direita para a esquerda, você obterá: "abased otet od esab A". Perceba que, com exceção do espaço, a sequência de caracteres é a mesma da frase original.

Faça um programa que indique se uma string dada é um palíndromo ou não.

Formato de entrada

A entrada consiste de um inteiro n seguido de n strings. Cada string contém no máximo 255 caracteres.

Formato de saída

Para cada string, imprima "SIM" caso seja um palíndromo e "NAO" caso contrário.

Exemplos de:

Entrada

3 ama A base do teto desaba o rato

 

Saída

SIM SIM NAO

 

Fiz um código que verifica se é ou não um palíndromo, mas não no formato de saída desejado pela questão e estou com dificuldades em reorganiza-lo. Parece um erro bobo, mas está bem difícil esse primeiro contato com computação eletrônica, visto que meu curso tem essa cadeira 'solta', começamos sem entender o que é um algoritmo e agora nessa pandemia estamos tendo aula remota, mas em um formato bem desestruturado. Estou buscando aprender mais. Desde já agradeço qualquer dica. Segue código:

 

void main(void){

    char entrada[100];
    char entradaespelhada[100];
    char metade1[50];
    char metade2[50];
    int tam=0;
    int tamcalc=0;
    int metade=0;

    scanf("%99[^\n]", entrada);  

    for(tam=0; entrada[tam]!='\0'; tam++); 
    tamcalc=tam; 
    metade=tam/2;

    for(int x=0;x<tam;x++){ 
        tamcalc--;
        entradaespelhada[x]=entrada[tamcalc];
    }
    entradaespelhada[tam]='\0';

    for(int x = 0; x<metade;x++){
        metade1[x]=entrada[x];
    }
    metade1[metade]='\0'; 

    for(int x=0;x<metade;x++){ 
        metade2[x]=entradaespelhada[x];
    }
    metade2[metade]='\0'; 

    if(strcmp(metade1,metade2)==0){ 
        printf("SIM");
    }
    else {
        printf("NAO");
    }
    
    return 0;
    
}

 

 

 

Postado

@ingrid.sol Seu programa não está ignorando os espaços e não está tratando os casos de letras maiúsculas e minúscula, p.ex ele responde corretamente para a palavra "ama", mas não para "Ama".

 

Para remover os espaços você pode usar uma string auxiliar para armazenar o conteúdo da frase sem os espaços, aí é verificar se a auxiliar é palíndromo. E para tratar igualmente os casos de letra maiúscula e minúscula você pode usar uma função de string.h para facilitar, como a toupper para testar todas as letras como maiúsculas (ou tolower para todas minúsculas).

  • Curtir 2
Postado

Com uma estrutura assim, fica bem fácil:

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


int ePalindromo(char *conteudo);

char *removerEspacos(char *conteudo);


int main() {
    const int tamanho = 256;   // Tamanho de cada frase
    const int quantidade = 2;  // Quantidade de frases

    char entrada[quantidade][tamanho];

    for(int i = 0; i < quantidade; i++) {
        printf("Digite o conteudo [ %d de %d ]: ", (i + 1), quantidade);
        fgets(entrada[i], tamanho, stdin);
        entrada[i][strcspn(entrada[i], "\n")] = '\0';
    }

    for(int i = 0; i < quantidade; i++) {
        int palindromo = ePalindromo(entrada[i]);

        if(palindromo == 1) {
            printf("SIM \n");
        } else {
            printf("NAO \n");
        }
    }

    return EXIT_SUCCESS;
}


int ePalindromo(char *conteudo) {
    // Falta fazer essa funcao. Retorna 1 se for palindromo e 0 se nao for.
    return 0;
}

char *removerEspacos(char *conteudo) {
    // Falta fazer essa funcao. Retornar a frase sem os espacos.
    return NULL;
}

 

  • Obrigado 1
Postado

Já que está resolvido vou postar a forma como comentei acima.

 

No primeiro loop trato a entrada removendo espaços e deixando todas as letras maiúsculas, assim basta apenas verificar se é palíndromo como no segundo loop. Só fiz o teste de uma frase, mas é fácil colocar outro loop para informar a quantidade desejada de frases.

 

#include <stdio.h>
#include <ctype.h>

int main(){
    char aux[256] = "A base do teto desaba";
    char frase[256];
    int T = 0;
    int palindromo = 1;
    
    for(int i = 0; aux[i]; i += 1){
        if(aux[i] != ' ' && aux[i] != '\n'){
            frase[T] = toupper(aux[i]);
            T += 1;
        }
    }
    frase[T] = 0;
    for(int i=0, j=(T - 1); frase[i]; i+=1, j-=1){
        if(frase[i] != frase[j]){
            palindromo = 0;
            break;
        }
    }    
    if(palindromo){
        printf("SIM\n");
    }else{
        printf("NAO\n");
    }
    return 0;
}

 

 

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...