Ir ao conteúdo

VisualG Verificador de Palíndromos - melhora na lógica


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Postado

Bom dia amigos, eu desenvolvi ontem esse algoritmo que faz a verificação se uma palavra é um Palíndromo ou não, no VisualG e gostaria de saber se alguém tem alguma ideia de como eu poderia melhorar essa lógica. O VisualG não tem muitos métodos para manipulação de strings, então fica difícil o negócio! :tw_confused:

Algoritmo "Verificador de palíndromos"
// Disciplina  :  [Algoritmos e Lógica de Programação]
// Descrição   : Este programa verifica se uma palavra, quando tem suas
//letras invertidas, acaba se tornando a mesma palavra. Ex: Arara.
// Autor(a)    : GKuze
// Data atual  : 12/06/2018


Var

   PalavraEscolhida: caractere //string
   vetPalavraInvertida : vetor [1..50] de caractere //armazena os caracteres da palavra escolhida em ordem contrária
   vetPalavraEscolhida : vetor [1..50] de caractere // caracteres da palavra escolhida
   indiceInverso: inteiro
   contador: inteiro
   n: inteiro
   palindrome: logico

Inicio
   contador <-  50;
   palindrome <- verdadeiro //"palindrome" por padrão
   escreva("Digite a palavra para verificar se ela é palindrome: ")
   leia(palavraEscolhida)

   contador <- compr(palavraEscolhida)

   para n de 1 ate contador faca
      indiceInverso <- (compr(palavraEscolhida) - n) + 1

      vetPalavraInvertida[indiceInverso] <- copia(palavraEscolhida, indiceInverso, 1)
      vetPalavraEscolhida[n] <- copia(palavraEscolhida, n, 1)

      se (vetPalavraEscolhida[n] <> vetPalavraInvertida[indiceInverso]) então
         //caso alguma letra da palavra invertida seja diferente da letra na
         //mesma posição, da palavra escolhida,
         //a variavel palindrome vira falso
         palindrome <- falso
      fimse

   fimpara

   se palindrome = verdadeiro então
      escreva("A palavra é palíndromo!")
   senao
      escreva("A palavra não é palíndromo...")
   fimse

Fimalgoritmo

 

  • Membro VIP
  • Solução
Postado

Olá.

 

1#

É para verificar uma palavra ou para verificar uma frase?... palíndromo geralmente se refere à última.

 

 

 

2#

Pelo que eu vi, você está comparando os caracteres de um posição, com a posição "oposta". Nesse caso, poderia fazer direto...

Ex.:

se copia(palavraEscolhida,n,1) <> copia(palavraEscolhida,((compr(palavraEscolhida)-n)+1) ,1) ENTÃO

 

Mesmo se fosse usar um vetor, poderia usar um vetor só... ou seja, compararia uma posição nesse vetor, com a posição oposta deste mesmo vetor.

 

 

 

2#

O que você está fazendo NÃO é verificar se é palíndromo, está apenas verificando se invertida fica igual. São coisas distintas... palíndromo não é só isso, ou seja, toda palavra que invertida fica igual é palíndromo, mas existem palavras que quando invertida não fica igual, e mesmo assim é palíndromo...  Ex: anã. Ele é palíndromo.

 

Se for usando frases, teríamos: Socorram-me, subi no ônibus em Marrocos. É palíndromo, mas se invertida não fica igual...

 

 

***

 

Em fim. Dê uma pesquisa sobe o que é palíndromo. Entenda melhor o problema e tente aplicar os conceitos.

 

No aguardo.

  • Curtir 1
Postado

@Simon Viegas Obrigado pela resposta! Eu tenho 2 meses pra dominar VisualG e Portugol, e me sair bem nas provas da faculdade, então estou pesquisando por problemas e exercícios pra ver se consigo desenvolver uma boa lógica com essas tecnologias.

  • Membro VIP
Postado
18 minutos atrás, GKuze disse:

@Simon Viegas Obrigado pela resposta! Eu tenho 2 meses pra dominar VisualG e Portugol, e me sair bem nas provas da faculdade, então estou pesquisando por problemas e exercícios pra ver se consigo desenvolver uma boa lógica com essas tecnologias.

 

De certo modo, você precisa ir aprendendo sobre técnicas de programação em geral... Visualg é apenas uma ferramenta, ou seja, estaria aprendendo técnicas utilizando Portugol. Se for utilizar outra linguagem de programação, as técnicas são parecidas, apenas precisará adequar as sintaxes da linguagem ("as regras"). A lógica envolvida para verificar se é palíndromo ou não independe da linguagem... por exemplo:

 

1 hora atrás, Simon Viegas disse:

se copia(palavraEscolhida,n,1) <> copia(palavraEscolhida,((compr(palavraEscolhida)-n)+1) ,1) ENTÃO

 

Estou verificando "se o caractere de uma posição é igual ao caractere da posição 'invertida'", ou seja, era preciso fazer isso... devido as característica do Visualg, foi imaginado utilizando o copiar() para ter acesso as letras específicas da palavra. A parte mais interessante é essa: sabe O QUE precisa fazer. O "COMO FAZER o que precisa" é só pesquisar um pouco sobre a sintaxe (o que inclui tirar dúvidas em fóruns, rs). A experiência com a linguagem vai se acumulando... por ai vai..

 

No Pascal, poderia ser algo como:

if copy(palavraEscolhida,n,1) <> copy(palavraEscolhida,((length(palavraEscolhida)-n)+1) ,1) then 

Entende? é a mais lógica, apenas usando a sintaxe da linguagem.

 

Mas aí, cada linguagem tem suas características especiais ou limitações... no Pascal mesmo, com a experiência do dia-a-dia e/ou sugestão de alguém etc, já saberia que numa string (análogo ao caractere) é possível acessar uma caractere de determinada posição usando o []. Se não soubesse ainda, num outro programa que precisasse acessar caracteres de uma string, lembraria dessa funcionalidade. A string aqui é como se fosse um vetor de char (também análogo ao caractere, mas este só cabe um caractere). Aí poderia fazer assim:

if (PalavraEscolhida[n] <> PalavraEscolhida[indiceInverso]) then

Não precisaria gerar um vetor, para depois comparar as posições... no Pascal, a lógica seria mais simples... não seria necessário ter que pensar em ter quer criar uma vetor...

 

 

Então, supondo que eu só tenha experiência em Pascal, a primeira coisa que eu fiz foi tentar acessar um caractere assim com os []. Não funcionou... dei uma leve pesquisada e me parece que esse recurso não está disponível no Visualg (apesar de usar uma linguagem irmã). Aí, teria que verificar outra forma de ter acesso a um posição... possivelmente encontraria essa tal de copia()......

adicionado 4 minutos depois

Só um adendo:

repeticao.png

 

kkkkkkk

Postado

@Simon Viegas  Sim, eu já entendo um pouco de C# e Java, pois, desde 2016 venho estudando por conta própria, e faria de maneira mais simples a mesma lógica, em uma dessas linguagens. O problema é que como estou agora no começo da faculdade de ADS, preciso aprender algoritmos e essa "sintaxe" do pseudo-código. Após sua sugestão eu limpei o código e reformulei seu propósito para "verificador de palavras palindrômicas", o que resolve a confusão de tentar checar por frases palindromes completas, o que o programa não faz. Agora meu código está assim:

Algoritmo "Verificador de palavras palindrômicas 2.0"
// Disciplina  :  [Algoritmos e Lógica de Programação]
// Descrição   : Este programa verifica se uma palavra, quando tem suas
//letras invertidas, acaba se tornando a mesma palavra. Ex: Arara.
// Autor(a)    : GKuze
// Data atual  : 12/06/2018

Var
   PalavraEscolhida: caractere //string
   contador: inteiro
   n: inteiro
   palindrome: logico

Inicio
   contador <-  50;
   palindrome <- verdadeiro
   escreva("Digite a palavra sem acentos para verificar se ela é palindrômica: ")
   leia(palavraEscolhida)

   contador <- compr(palavraEscolhida)

   para n de 1 ate contador faca

      se (copia(palavraEscolhida, n, 1) <> copia(palavraEscolhida, (compr(palavraEscolhida)-n)+1, 1)) então
          palindrome <- falso
      fimse

   fimpara

   se palindrome = verdadeiro então
      escreva("A palavra é palindrômica!")
   senao
      escreva("A palavra não é palindrômica...")
   fimse
Fimalgoritmo

 

Agradeço seu tempo e esforço ao me ajudar!

  • Membro VIP
Postado

1#

2 horas atrás, Simon Viegas disse:

1#

É para verificar uma palavra ou para verificar uma frase?... palíndromo geralmente se refere à última.

 

Era uma pergunta... esqueci da "?", rs   (obs.: editei a postagem)

 

 

 

2#

É... para uma palavra não muda muita coisa, creio que basicamente seria essa parte dos acentos. A questão principal é com frases.

 

***

 

Então, qual o enunciado completo dessa questão?

 

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!