Ir ao conteúdo
  • Cadastre-se
Lucas.Rocha_21

Ajuda - Programa que verifica se a palavra é um palíndromo

Recommended Posts

Diferente de alguns outros tópicos que surgem eventualmente nos quais a pessoa coloca simplesmente o enunciado do exercício e deixa um vazio profundo para que você resolva por ela  :D , este aqui está pronto e feito por mim haha.

 

Para quem não sabe, palíndromo são aquele grupo de palavras (ou orações) que é lido da mesma maneira na ordem direita para esquerda e vice-versa. Um exemplo é a palavra arara ou então ovo. 

 

A minha dúvida é o seguinte: No código que eu digitei, gostaria de saber se há uma maneira mais eficiente de inserir a palavra na lista que não seja digitar caracter por caracter e pressionando ENTER. Gostaria por exemplo em digitar em uma linha só do prompt a palavra ou oração e apertando enter continua o programa. Um vetor temporário para tal não seria bem o desejado. Caso contrário, a lista seria

inútil. A intenção da lista é justamente poder colocar a palavra o quão grande quanto eu queira já que o espaço para a palavra seria armazenado em tempo de execução e não em tempo de copilação. 

 

Código:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include "lista.h"#include "pilha.h"#include <locale.h>void TransfereParaPilha (MinhaLista *x, MinhaPilha *y);int Compara(MinhaLista *x, MinhaPilha *y);void main(void){    setlocale(LC_ALL, "");    TipoCelula *lista;    MinhaPilha *PilhaTeste;    lista = inicializar();    PilhaTeste = novapilha();    char letra;    while(letra != '\n')    {        printf("Insira uma letra e digite ENTER\n(ou aperte ENTER 2 vezes para sair || 3 vezes para continuar).......: ");        scanf("%c%*c", &letra);        if (letra != '\n')             lista = inserir_ultimo(lista, (tolower(letra)));    }    if(!TestaListaVazia(lista))    {        printf("A palavra é ");        imprimir(lista);        TransfereParaPilha(lista, PilhaTeste);        if(Compara(lista, PilhaTeste) == 1)            printf("\ne é palíndromo");        else            printf("\ne não é palíndromo");    }    else        printf("\nNão digitou a palavra!\n");}void TransfereParaPilha (MinhaLista *x, MinhaPilha *y){    TipoCelula *listatemp;    listatemp = x;    while(listatemp != NULL)    {        push(y, listatemp -> letra);        listatemp = listatemp -> proximo;    }}int Compara(MinhaLista *x, MinhaPilha *y){    TipoCelula *listatemp;    listatemp = x;    char temp;    while(!TestePilhaVazia(y))    {        if (listatemp -> letra != ' ')        {            do {              temp = pop(y);            } while (temp == ' ');            if(temp != listatemp -> letra)                return 0;        }        listatemp = listatemp -> proximo;    }    if(TestePilhaVazia(y)) //quer dizer que já comparei com todos os elementos        return 1;}

Aviso: Este programa faz uso das bibliotecas customizadas "lista.h" e "pilha.h" que eu fiz. Logo, se você copiar diretamente para o main.c de seu projeto, vai "dar ruim"!

 

O programa funciona da seguinte maneira. Você vai inserindo letra por letra a palavra desejada e nisto, vai sendo transferido para a lista onde ela estará armazenada. Se eu der enter duas vezes (justamente por causa do %*c) que desconsidera o ENTER que aperto a cada letra, lá no buffer, eu desisto de colocar a palavra, a lista portanto é vazia e logo não digitei a palavra. Para continuar o programa preciso dar enter 3 vezes. A terceira é para o programa dar prosseguimento.

 

Explicado isto, depois cada elemento da lista é jogado para uma pilha e começa a comparação. O programa é capaz por exemplo de ignorar os espaços. Neste caso "A caca" seria um palíndromo (e é um palíndromo!). Para tal verifico primeiro se o elemento da lista é um espaço. Se for, peço para que ele avance uma letra. Caso contrário, vejo se o elemento da pilha é um espaço. Se for um espaço, ele vai desempilhando quantas vezes forem necessárias até que não seja mais espaço. Caso o elemento da pilha e da lista forem diferentes, a palavra não é um palíndromo. Se a pilha estiver vazia, quer dizer que eu comparei todos os elementos da lista. Então neste caso, a palavra seria um palíndromo.

 

Abaixo, o arquivo do projeto.

palindromo_lista_pilha - 2.0.rar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, em C não sei, mas em outras linguagens até tem outras formas para fazer isso sem ter que ler letra por letra, que senão forem mais rápidas, são pelo menos mais simples para fazer isso.

Agora, utilizando estruturas de dado, essa é a forma mais simples de resolver. Da pra resolver isso utilizando apenas uma Pilha, mas creio que piore o desempenho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

acredite ou nao nao tem nada standard pra esse tipo de coisa em C,se voce tivesse em c++ poderia usar getline() com um delimitador,existe a função  _getch() e Kbhit(),porém nao sao recomendadas ja que nem todo compilador implementa essas funções e pelo que eu vi ninguem sabe o tempo de delay que elas fazem no processador(nao que isso seja realmente um problema em um programa que nao exija precisão extrema de I/O)

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

×