Vamos a programar #41 - Números palindrómicos (ver. Java for android)

Hola de nuevo a todos, el día de hoy y despúes de unas largas y mal merecidas "vacaciones", vamos a continuar con más temas de programación.
La última vez que vimos un post sobre programación, vimos la conjetura de los números palíndrómicos e hicimos un programa en C# para windows. Hoy y cómo en ocasiones anteriores, vamos a ver cómo hacer una versión para android.

El código.

El código en java que hace funcionar las cosas es el siguiente:

package com.mdev.numerospalindromos;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import java.lang.String;
import java.math.BigInteger;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
public class MainActivity extends Activity {
	Button BtnCalculate;
	TextView TxtNumberIn;
	TextView TxtIterations;
	ListView LVResultados;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		BtnCalculate = (Button)findViewById(R.id.BtnCalculate);
		TxtNumberIn = (TextView)findViewById(R.id.TXTNumberIn);
		TxtIterations = (TextView)findViewById(R.id.TxtIterations);
		LVResultados = (ListView)findViewById(R.id.LVResults);
		BtnCalculate.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				GetNumber(TxtNumberIn.getText().toString(), Integer.parseInt(TxtIterations.getText().toString()));
			}
		});
	}
	private boolean IsPalindrome(String Number)
	{
		String Value = ReverseNumber(Number);
		if (Number.equals(Value))
			return true;
		else
			return false;
	}
	private String ReverseNumber(String NumberIn)
	{
		char[] charArray = NumberIn.toCharArray();
		char[] OutArray = new char[charArray.length];
		for (int i = charArray.length-1; i >= 0 ; i--){
			OutArray[charArray.length - 1 - i] = charArray[i];
		}
		return new String(OutArray);
	}
	private void GetNumber(String Number1, Integer MaxIterations)
	{
		ArrayList Items = new ArrayList();
		int Iterator = 1;
		if (IsPalindrome(Number1))
		{
			Items.add("0 iteraciones " + Number1 + " cumple la conjetura");
		}
		else
		{
			BigInteger Result = new BigInteger(Number1);

			while (!IsPalindrome(Result.toString()))
			{
				BigInteger NewNumber = new BigInteger(ReverseNumber(Result.toString()));
				Result = Result.add(NewNumber);
				if (Iterator >= MaxIterations)
				{
					break;
				}
				Iterator += 1;
				Items.add(Iterator + " iteraciones " + Result);
			}

			if (IsPalindrome(Result.toString()))
				Items.add("La conjetura se cumple");
			else
				Items.add("La conjetura no se cumple.");
		}
		final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,Items);
		LVResultados.setAdapter(adapter);
	}
}

El código consta de 3 funciones. La primera de ellas en orden de aparición, es: IsPalindrome y aunque su nombre lo diga o lo haga parecer, esta función no es la encargada de hacer los cálculos. La función simplemente comprueba que el valor que se pasa cómo parámetro, cumpla con la condición: "es igual si se lee al derecho que al revés", usando la función "ReverseNumber". Si la condición se cumple, la función regresa un valor booleano "true" en caso contrario regresa "false".

La función "ReverseNumber", sirve para invertir el orden de los dígitos de un número, es decir; el primer número pasa a ser el último y viceversa. hay que recordar que la conjetura nos dice que se debe de obtener un palíndromo si se suma un número que sea el mismo número pero invertido. Esta función recibe un parámetro del tipo "String" que representa el número que queremos invertir. La función usa dos "Arrays" que contienen los dígitos almacenados como caracteres, por lo que "2" es algo totalmente diferente a 2, el parámetro de entrada, es el primero en separarse, con eso obtenemos el tamaño que tendrá el otro "Array" y lo asignamos al momento de crearlo. Para formar el valor de salida, simplemente recorremos en orden inverso el "Array" que contiene los digitos del valor de entrada. La función regresa un valor del tipo "String" que representa el parámetro  de entrada en orden inverso.

Finalmente el procedimiento que se encarga de comprobar la conjetura es "GetNumber". Este procedimiento hace todos los pasos.  El procedimiento recibe dos parámetros, el primero del tipo "String", es el número al cual le queremos aplica la conjetura, el segundo, es in valor del tipo "Integer" que contiene el valor máximo de la iteraciones. Antes de si quiera empezar con los cálculos, comprobamos que el valor que se ingresa  cumpla la conjetura, si lo hace, simplemente informamos que el  número es palíndromo y terminamos el procedimiento. En  caso contrario, empezamos convirtiendo el valor de "String " a "BigInteger". Luego iniciamos un bucle "while" en el cual haremos uso de la función "IsPalindrome" mientras está sea falsa  o mientras el valor de la variable "Iterator" sea menor que  el parámetro "MaxIterations". Cuando cualquiera de las condiciones es verdadera, salimos del bucle; si salimos debido a que la función "IsPalindrome" resulta verdadera,  mostramos un mensaje indicando que el número cumplió con la conjetura; pero si la salida del bucle se debe a que el número de iteraciones alcanzo el máximo indicado por el usuario, mostramos un  mensaje que la conjetura no se cumplió. En este caso, que un número no cumpla la conjetura en X numero de iteraciones, no quieres decir que por ello este exento, algunas veces bastará con aumentar el número de iteraciones.

Y bien, por ahora es todo, al igual que las otra aplicaciones, el código fuente pronto la publicaré en la sección de descargas, el APK ya compilado, lo puedes descargar de mi dropbox.
Antes de terminar, debo aclarar que la aplicación aun no es a prueba de errores, y peor aun, no es a prueba de si misma. Todo es meramente ilustrativo, porque la aplicación va a hacer lo que el usuario le diga y por el momento no es recomendable pasar de las 1000 iteraciones; aunque la mayoría de los numero comprendidos entre 1 y 1000 la cumplen en unos cuantos pasos, puede pasar que haya un número que ni con 20000 iteraciones la cumpla, al hacer 20000 pasos la aplicación demandará memoria y capacidad de procesamiento por lo que las cosas se pueden volver inestables, además como todas las comprobaciones se hacen en el hilo principal, la aplicación se bloqueará hasta que termine (cualquiera de los dos casos, si se cumple o si se llego al limite establecido), en los siguiente post veremos cómo usar "threads" (C# y Java) y cómo manejarlas un poco, para; si por ejemplo; comenzamos un proceso largo, lo podamos detener en cualquier momento (si aun así quieres probar los alcances de tu dispositivo, puedes probar el número 196 con el límite que más gustes, pero quedas advertido que ni con 24000 iteraciones se cumple la conjetura).

Por ahora es todo. Los leo luego.

No hay comentarios.