identificação de palíndromos?

Ta aí uma coisa que nao consigo imaginar…
usando if, if…else, e/ou while:

Deitel:
4.30 (Palíndromos) Um palíndromo é uma seqüencia de caracteres que é lida da esquerda para a direita, ou da direita para esquerda. Por exemplo, cada um dos seguinter inteiros de cinco dígitos é um palíndromo: 12321, 55555, 45554, 11611. Escreva um aplicativo que leia em um inteiro de cinco de dígitos e determine se ele é ou não um palíndromo. Se o número não for de cinco dígitos, esxiba uma mensagem de erro e permita que o usuário insira um novo valor.

A grande dúvida é… qual a condição que validaria um políndromo??? Precisaria ler caractere por caractere? se sim, como se faz? se não, como???

obrigado.

Ola blza? Para vc saber a quantidade de digitos divida o numero por 10.

while(num !=0){
num = num/10;

        quantidade++;
    }

está ai um dica valeu…

:lol:

String x = "123454321"; StringBuffer y = new StringBuffer( x ); if( x.equals( y.reverse() ) ) { //palindromo } else { //nao eh }

O caractere da posição i deve ser igual ao da posição length - i, para todo i.

Pense um pouco e tente fazer com essa idéia antes de ver o código pronto :wink:

public class Palindrome {
        public static void main(String[] args) {
                int i = 0;
                while (i < args[0].length()) {
                        if (args[0].charAt(i) != args[0].charAt(args[0].length() - i -1)) {
                                System.out.println("Nao eh palindrome.");
                                System.exit(0);
                        }
                        i++;
                }
                System.out.println("Eh palindrome");
        }
}

Uma outra idéia, se o seu professor não quiser que você use recursos prontos, ou se você quiser conhecer outras possibilidades…

Use uma estrutura de dados do tipo PILHA (LIFO - last in first out). Você pode usar algo pronto ou criar um objeto pilha que utiliza um vetor de cinco posições e tem os métodos push() (inserir) e pop() (remover).

Vá pegando cada caractere do String (do 1º ao último) e inserindo um por um na pilha.

int valorRecebido = 12345; String numeros = String.valueOf(valorRecebido); for(int i=0;i<numeros.length();i++){ pilha.push(numeros.charAt(i)); }

Depois crie uma segunda String (o ideal seria um StringBuffer, mas eu sugiro String pra usar o mínimo de recursos possível), vá desempilhando cada caractere e concatenando nessa nova String. Você obterá o “espelho” da String original. Na verdade é exatamente isso que o reverse() faz, internamente.

String numerosInverso; while(!pilha.isEmpty()){ numerosInverso += pilha.pop(); }

Agora compare as duas Strings, se forem iguais é um palíndromo.

if(numeros.equals(numerosInverso)){ // é um palíndromo }

Cabe a você criar essa classe Pilha, que pelo jeito vai receber caracteres (char). É um bom exercício para estudar conceito de estruturas de dados, e é simples de fazer. A dica é dentro da classe Pilha colocar uma variável int topo, que inicialmente vale -1 e indica onde está o topo da pilha conforme o número de caracteres que foi inserido. o método isEmpty() pode verificar se o topo vale -1. O método push(char a) pode colocar o caractere em vetor[++topo]; e o pop() pode remover o caractere do topo da pilha assim: vetor[topo–]. Eu não vou dar tudo mastigadinho, assim você estuda um pouco.

Divirta-se!

obs: se você resolver o problema e / ou alguém se interessar em como seria essa classe Pilha, eu faço o código para mostrar. Uma pilha criada assim funciona muito rápido.

[quote=Fox McCloud]Uma outra idéia, se o seu professor não quiser que você use recursos prontos, ou se você quiser conhecer outras possibilidades…

Use uma estrutura de dados do tipo PILHA (LIFO - last in first out). Você pode usar algo pronto ou criar um objeto pilha que utiliza um vetor de cinco posições e tem os métodos push() (inserir) e pop() (remover).

Vá pegando cada caractere do String (do 1º ao último) e inserindo um por um na pilha.[/quote]

:shock: Se podemos complicar, pra que simplificar?

Huahuahua. E não é esse justamente o lema?
:lol:

Ora, vamos lá, existem ferramentas hoje em dia em que você coloca as necessidades do cliente e ela gera um sistema completo com banco de dados na linguagem que você quiser. Onde estão os verdadeiros programadores?

Ainda que se faça isso uma vez na vida (uma Pilha), para nunca mais, pelo menos é um bom exercício de lógica, além de ficarmos sabendo como o Java fez internamente.
:wink:

Só uma observação que não tem nada a ver com o problema: palíndromo é usado para palavras que podem ser lidas “de frente pra trás e de trás pra frente”. Para números o termo certo é capícua (http://pt.wikipedia.org/wiki/Capicua).

boa, manda isso pra deitel

[quote=Hawk]Ta aí uma coisa que nao consigo imaginar…
usando if, if…else, e/ou while:

Deitel:
4.30 (Palíndromos) Um palíndromo é uma seqüencia de caracteres que é lida da esquerda para a direita, ou da direita para esquerda. Por exemplo, cada um dos seguinter inteiros de cinco dígitos é um palíndromo: 12321, 55555, 45554, 11611. Escreva um aplicativo que leia em um inteiro de cinco de dígitos e determine se ele é ou não um palíndromo. Se o número não for de cinco dígitos, esxiba uma mensagem de erro e permita que o usuário insira um novo valor.

A grande dúvida é… qual a condição que validaria um políndromo??? Precisaria ler caractere por caractere? se sim, como se faz? se não, como???

obrigado.
[/quote]

Segue o código desse exercício:


// Exercício 4.24 Ex4_24.java
// recebe um inteiro de 5 dígitos e imprime uma mensagem dizendo se ele é ou não um palíndromo

import javax.swing.JOptionPane;

public class Ex4_24
{
	public static void main ( String args [] )
	{
		int number,		// número inserido pelo usuário
			n1,			// corresponde ao primeiro digito
			n2,			// corresponde ao segundo digito
			n3,			// corresponde ao terceiro digito
			n4,			// corresponde ao quarto digito
			n5;			// corresponde ao quinto digito
		double num = 0;
		
		// recebe o número do usuário
		number = Integer.parseInt (JOptionPane.showInputDialog ("Digite um número com 5 digitos: "));
		
		// verifica se o número tem 5 digitos
		while ( number > 99999 )
		{
			JOptionPane.showMessageDialog ( null, "O número possui mais de cinco dígitos!");
			
			// digita novamente um número
			number = Integer.parseInt (JOptionPane.showInputDialog ("Digite um número com 5 digitos: "));
			
			while ( number <= 9999 )
			{
				JOptionPane.showMessageDialog ( null, "O número possui menos de cinco dígitos!");
				
				// digita novamente um número
				number = Integer.parseInt (JOptionPane.showInputDialog ("Digite um número com 5 digitos: "));
			}
			
		}
		
		while ( number <= 9999 )
		{
			JOptionPane.showMessageDialog ( null, "O número possui menos de cinco dígitos!");
			
			// digita novamente um número
			number = Integer.parseInt (JOptionPane.showInputDialog ("Digite um número com 5 digitos: "));
			
			while ( number > 99999 )
			{
				JOptionPane.showMessageDialog ( null, "O número possui mais de cinco dígitos!");
				
				// digita novamente um número
				number = Integer.parseInt (JOptionPane.showInputDialog ("Digite um número com 5 digitos: "));
			}
			
		}
		
		// fiz um teste com o número 15951
		n1 = number / 10000;												// 15951   / 10000  = 1
		n2 = (number / 1000) - (n1 * 10); 									// 15951   / 1000    = 15    - 10          = 5
		n3 = (number / 100) - (n1 * 100) - (n2 * 10);						// 15951   / 100      = 159  - 100        = 59   - 50   = 9
		n4 = (number / 10) - (n1 * 1000) - (n2 * 100) - (n3 * 10);			// 15951   / 10         = 1595  - 1000   = 595 - 500 = 95  - 90 = 5
		n5 = number - (n1 * 10000) - (n2 * 1000) - (n3 * 100) - (n4 * 10);	// 15951   - 10000   = 5951   - 5000  = 951  - 900 = 51  - 50 = 1
		
		if (n1 == n5)
		{
			if (n2 == n4)
			{
				JOptionPane.showMessageDialog ( null, "O número digitado é um palíndromo!");
			}
			else
			{
				JOptionPane.showMessageDialog ( null, "O número digitado não é um palíndromo!");
			}
		}
		else
		{
			JOptionPane.showMessageDialog ( null, "O número digitado não é um palíndromo!");
		}
		
		System.exit ( 0 );
		
	}
}

Tem as explicações necessárias como comentários.

Falow…

Gostaria de saber a resolução deste exercicio acima, mas em portugol estou aprendenda
ainda mexer com logica e seria muito grato!

Djavan

import java.util.Scanner;

class VerificaPalindrome { // método usando classe String e StringBuffer

    static Scanner I = new Scanner(System.in);

    public static void main(String args[]){

        System.out.print("Digite uma palavra(Para sair digite FIM): ");//pode se digitar um nº também mas lembre-se que
        String s = I.nextLine();
        int nCont = 0;
        StringBuilder sb = new StringBuilder(s);

        if(s.equals(sb.reverse().toString()))
        {  // equals é um método que compara String
            System.out.println("É palindromo") ;// e sb e sb.reverse são StringBuffer por
            nCont++;
            System.out.println("Contabilizados " + nCont + " palindromos");
            System.out.println("------------");
        }
        else {                                                  // isso .toString pra converter
            System.out.println("Não é palindromo");
            System.out.println("Contabilizados " + nCont + " palindromos");
            System.out.println("------------");

        while(!s.equals("fim")){

            System.out.print(("Digite uma palavra(Para sair digite FIM): "));//pode se digitar um nº também mas lembre-se que
            s = I.nextLine();
            sb = new StringBuilder(s);            

            if (s.equals(sb.reverse().toString())){  // equals é um método que compara String
                System.out.println("É palindromo") ;// e sb e sb.reverse são StringBuffer por
                nCont++;
                System.out.println("Contabilizados " + nCont + " palindromos");
                System.out.println("------------");
            }
            else {                                                  // isso .toString pra converter
                System.out.println("Não é palindromo");
                System.out.println("Contabilizados " + nCont + " palindromos");
                System.out.println("------------");
                }
            }
        }
    }
}

Segue uma solução para esta capícua (como bem informado pelo David neste tópico) e que aprendi ao fazer o (exerc 2.30 - pág. 54) do próprio Deitel,

import java.util.Scanner;

public class Palindromo {

	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);

        int valorUsuario, quinto, quarto, terceiro, segundo, primeiro;

        System.out.print("Informe um valor inteiro de 5 casas: ");
        valorUsuario = input.nextInt();
        
        while (valorUsuario < 10000 || valorUsuario > 99999){
            
			 System.out.print("Entrada Inválida! Informe um valor inteiro de 5 casas: ");
			 valorUsuario = input.nextInt();
		}

        quinto = valorUsuario % 10;
        valorUsuario /= 10;

        quarto = valorUsuario % 10;
        valorUsuario /= 10;

        terceiro = valorUsuario % 10;
        terceiro = terceiro + 0;// isso é besteira, somente para não exibir Warning
        valorUsuario /= 10;

        segundo = valorUsuario % 10;
        valorUsuario /= 10;

        primeiro = valorUsuario % 10;
        
        if (primeiro == quinto && segundo == quarto){
        	
        	System.out.println();
        	System.out.println("O número é um palíndromo!");
        } else {
        	
        	System.out.println();
        	System.out.println("O número não é um palíndromo!");
        }
	}
}