semana del año en Java

0 comentarios

En esta ocasión estamos creando el algoritmo definido por la ISO 8601 para poder poner el día de la semana en la que nos encontramos.

public class SemanaAnno{
	public Integer semanaAnno(Calendar fecha){
		//conseguimos el dia de año, un año tiene 365 dias... 366 si es bisiesto.
		Calendar cal = new GregorianCalendar();
		int mes = cal.get(fecha.MONTH)+1;
		int a = mes==1||mes==2?cal.get(fecha.YEAR)-1:cal.get(fecha.YEAR);
		int b = (a/4)-(a/100)+(a/400);
		int c = ((a-1)/4)-((a-1)/100)+((a-1)/400);
		int s = b-c;
		int e = mes==1||mes==2?0:s+1;
		int f;
		if(mes==1||mes==2){
			f=cal.get(fecha.DAY_OF_MONTH)-1+(31*(mes-1));
		}else{
			f=cal.get(fecha.DAY_OF_MONTH)+((153*(mes-3)+2)/5)+58+s;
		}
		int g = (a+b)%7;
		int d = (f+g-e)%7;
		int n = f+3-d;
		if(n<0){//Corresponde al año anterior
			return (53-((g-s)/5));
		}else if(n>364+s){//Corresponde al año siguiente
			return 1;//corresponde al año siguiente
		}else{//corresponde al año en curso.
			return (n/7)+1;
		}
	}
}

Como seguro que os lo vais a preguntar ya lo cuento de antemano, las variables no son nemotécnica por que realmente no se muy bien que es lo que estamos haciendo en cada paso, lo cual supone un gran fallo para cualquier programador, pero la verdad es que este "trabajito" ya me estaba trayendo por la calle de la amargura, no he conseguido encontrar el ISO 8601 en toda su extensión, solamente pequeñas pretensiones que indicaban el tipo de formateo permitido por la ISO, la verdad es que eso me sirvió de poco.

Las paginas que encontré con el calculo eran solamente aproximaciones que yo ya había probado, desde contar los días hasta contar el día total en el que estamos en el año, vamos lo que viene a ser el día Juliano, sumarle el día en que comenzó la semana, cosa que ya hemos calculado antes, vamos que funcionar funcionaba, pero que pasaba cuando decías de contar el 1 de Enero de cualquier año, pocas veces coincide que la semana del 1 comience en lunes, por lo que las cuentas solo salían para ciertos meses y para ejemplo un botón, el 1 de Enero del 2012 es el domingo de la semana 52 del año 2011, según nuestro recuento que pasaría,  como ha comenzado el año en domingo le sumamos cinco, se suman cinco por que la semana la iniciamos en lunes, 6/7 el mod de esta división nos daría un total de 0, se puede realizar una división normal ya que estamos dividiendo enteros y asignándoselo a enteros. Muy bien y vosotros diréis, pues ya esta si es 0 se corresponde a la ultima del año anterior, pero esto ya seria regresivo, tendríamos que volver a hacer todo pero con el 31 de Diciembre del año anterior. Pero que paso en Enero del 2009, según las cuentas hasta el día 5 no podemos marcar la primera semana del año, esto se trataría de otra excepción, por que si buscamos los calendarios de esos años nos encontraremos que la primera semana del año fue la misma que contenía el día uno.

Con el código que aquí comparto todos estos datos quedan cubiertos dando en definitiva el día exacto, igual me hacen falta más pruebas comparando con los calendarios de otros años, pero en un principio y por las pruebas realizadas este código es correcto.

El código original del que me he basado es un JavaScript que encontré en la red, lamento no poder dar referencias pero es que no me acuerdo, me lo copie en el NotePad++ y se me olvido guardar la pagina en favoritos, realmente deseo que les guste el aporte y les pueda resultar útil.

Creando un editor en Java

0 comentarios

A traves de la pagina de chuidiang he visto que daba una guia de como montar nuestro propio editor de textos con Java, en este caso es un editor muy sencillo pero que en mi caso personal me abre todo un mundo ya que estoy más acostumbrado a utilizar Java unicamente como back-end y utilizo otros frameworks para el front-end, en estos momentos para ser exactos estoy usando Flex en mi día a día.

Lo primero es generar la ventana con todos sus elementos, pero como eso nos dejaria una función principal demasiado pesada lo que tenemos que hacer es generar un constructor que divida los problemas para que los separe y los trate de manera personal.
Y por eso nuestro constructor quedaria de la siguiente manera

    public LDEditor()
    {
        JMenuBar barraMenu = new JMenuBar();
        
        areaTexto = new JTextArea(30, 90);
        
        buildFileMenu(barraMenu);
        buildEditMenu(barraMenu);

        JFrame frame = buildEditorWindow(barraMenu);
        viewWindow(frame);
    }

JTextArea solicita dos parametros de tipo integer para poder definir cuanto tiene que medir, en mi caso quiero que se visualicen treinta lineas y noventa columnas "JTextArea(int rows, int columns)"

Ahora generaremos todo el codigo para crear el menu correspondiente a "Archivo".
En este menu incluiremos las tres opciones basicas: Salvar, cargar y Salir.

Para ello creamos los tres items del menu, despues creamos el menu propiamente dicho y le añadiremos los tres items.
Tras esto añadimos todo el menu a la barra de menu que hemos recibido por parametro.

    private void buildFileMenu(JMenuBar barraMenu)
    {
        JMenuItem salvar = new JMenuItem("Salvar");
        JMenuItem cargar = new JMenuItem("Cargar");
        JMenuItem salir = new JMenuItem("Salir");
        
        JMenu menuArchivo = new JMenu("Archivo");
        
        menuArchivo.add(salvar);
        menuArchivo.add(cargar);
        menuArchivo.add(salir);
        
        barraMenu.add(menuArchivo);
    }

Ahora haremos el mismo proceso para el menu de edicion.
En este caso hay una modificación, y es que para separar la opcion de buscar y de las que editan el texto hemos metido un separador, para ello se ha introducido " menuEditar.add(new JSeparator());" se añade como un item más y ya que no vamos a hacer nada más con él no hace falta crearlo como variable

    private void buildEditMenu(JMenuBar barraMenu)
    {
        JMenuItem buscar = new JMenuItem("Buscar");
        JMenuItem copiar = new JMenuItem("Copiar");
        JMenuItem cortar = new JMenuItem("Cortar");
        JMenuItem pegar  = new JMenuItem("Pegar");

        JMenu menuEditar = new JMenu("Editar");
        menuEditar.add(buscar);
        
        menuEditar.add(new JSeparator());
		
        menuEditar.add(cortar);
        menuEditar.add(copiar);
        menuEditar.add(pegar);
        
        barraMenu.add(menuEditar);
    }

Ahora vamos a juntar todo para crear un JFrame

    private JFrame buildEditorWindow(JMenuBar barraMenu)
    {
        JFrame frame = new JFrame("Test de editor de Liem Dazkun");
        
        //El menú va en la parte superior,
        frame.getContentPane().add(barraMenu, BorderLayout.NORTH);
        
        //El comando que activa / desactiva el ajuste de linea 
        areaTexto.setLineWrap(true);
        
        //El comando que hace que el ajuste de linea se haga donde haya un espacion en blanco.
        areaTexto.setWrapStyleWord(true);

        JScrollPane scroll = new JScrollPane(areaTexto);
        
        // El scroll con el JTextArea se añade por defecto en el centro del BorderLayout.
        frame.getContentPane().add(scroll);

        return frame;
    }

Finalmente cargamos y lanzamos toda la pantalla para que se pueda visualizar.

    private void viewWindow(JFrame frame)
    {
    	// Para salir del programa en caso de pulsar el aspa de la esquina superior derecha de la ventana.
    	frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        // La ventana coge el tamaño justo para que se vean completamente todos los componentes
    	frame.pack();

        // Se obtienen las dimensiones en pixels de la pantalla.
        Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize();
        
        // Se obtienen las dimensiones en pixels de la ventana.
        Dimension ventana = frame.getSize();
        
        // Una cuenta para situar la ventana en el centro de la pantalla.
        frame.setLocation(
            (pantalla.width - ventana.width) / 2,
            (pantalla.height - ventana.height) / 2);
        
        // Se visualiza la ventana.
        frame.setVisible(true);
    }

¿En que día de la semana vivimos? escrito en Java

0 comentarios


Basándome en los datos extraídos de la Wikipedia  he confeccionado la función necesaria para saber si nos encontramos a martes o a miércoles.

Lo primero que se tiene que hacer es cargar unas contantes, la primera fila corresponde a los días de la semana, se coloca como primer día el domingo por que es el séptimo día de la semana y lógicamente cuando se calcula el resto dividiendolo entre siete da cero.
La segunda fila es un array de arrays de integer, estos campos son calculables, pero son unos datos constantes de manera que no los meto en la función por la carga de proceso, que no seria muy grande, pero si el código lo llevamos a un proyecto más grande este se puede resentir por tanto calculo. De todos modos el calculo es muy sencillo, es el modulo de la suma de los módulos del máximo de días de los meses, o lo que es lo mismo si hablamos de marzo seria (31%7 + 28%7 + 31%7)%7, en año bisiesto seria (31%7 + 29%7 + 31%7)%7, siempre es lo mismo por eso no vale la pena y lo cargo en un método estático.

//Se cargan los datos que seran constantes durante todo el proceso.
public static final String[] diaSemana = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};
public static final int[][]modulos = {{0,3,3,6,1,4,6,2,5,0,3,5},{0,3,4,0,2,5,0,3,6,1,4,6}};

Despues el metodo que hace falta para hacer el caculo seria:

public int calculoDia(Calendar fecha){
	//Generamos las variables necesarias
	AnnoBisiesto annoBisiesto = new AnnoBisiesto();//La clase que nos calculara si el año es bisiesto o no.
	Calendar c = new GregorianCalendar();//necesario para convertir los datos a fecha actual
	int diaSemana; //sera el dia que devolvemos 0 = Domingo
	int mM; // es el modulo del mes, es un dato calculable pero al ser constante lo pongo como estatico.
	int year = c.get(fecha.YEAR);//El año
	int dia = c.get(fecha.DAY_OF_MONTH);//El dia al que estamos
	int sum1, sum2, sum3, temp1, temp2, temp3;//creamos tres de las cuatro sumas. Los temporales hacen falta ya que no se cuenta el resto de las divisiones
	//miramos si el año es bisiesto para asignar 0 o 1, necesario para la seleccion del array
	int bisiesto = annoBisiesto.AnnoBisiestoGood(fecha)?1:0;
	//extraemos el modulo que se utilizara para la suma total
	mM = modulos[bisiesto][c.get(fecha.MONTH)];
	//El tratamiento son cuatro sumas de cuatro modulos de 7
	//la formula seria
	//((A-1)%7+((A-1/4)-(3*((A-1/100)+1)/4))%7+DM%7+D%7)%7
	//donde A=año, DM=Dias transcurridos hasta antes del primer dia del mes, D=dia, % = Modulo y en todas las divisiones solo se consideran las cifras enteras.
	sum1 = (year-1)%7;
	temp1 = (year - 1)/4;
	temp2 = (year - 1)/100;
	temp3 = ((temp2+1)*3)/4;
	sum2 = (temp1 - temp3)%7;
	sum3 = dia%7;
	diaSemana = (sum1 + sum2 + mM + sum3)%7;
	return diaSemana;
}

Recordemos que la división de dos enteros da como resultado un long, por eso utilizo los temporales, para que se eliminen los restos y trabaje solamente con enteros tras una división. Recordemos también que la función "annoBisiesto.AnnoBisiestoGood" esta escrita en la anterior publicación de este blog, por si alguno no sabe como calcular el año bisiesto.

Y con este código tenemos el calculo completo de en que día vivimos.

Año bisiesto en Java

0 comentarios


Hay un problema muy simple de solucionar que es prácticamente uno de los primeros que se pide cuando estas estudiando programación, la gente normal, entre la que me incluyo, suele hacerlo paso a paso dando como resultado el "AnnoBisiestoBad" el cual es correcto al 100%, no nos engañemos, pero como se puede observar en "AnnoBisiestoGood" es que no es para nada optimo ya que con una sola linea podríamos haber resuelto el problema.


package LFR.Liem.Dazkun.Test.Java.Fecha.AnnoBisiesto;

import java.util.Calendar;

public class AnnoBisiesto{
	public boolean AnnoBisiestoBad(Calendar fecha){
	{
		int anno = fecha.YEAR;
	   //Si el año es divisible por 4, puede ser bisiesto
	   if (anno % 4 == 0){
	      if ((anno % 100 == 0) &&  //Si es divisible por 100
	           (anno % 400 != 0)){    //y no por 400
	             return false; //entonces no es bisiesto
	         }else{
	            return true; //En caso contrario sí lo es.
	         }
	      }else {//Si el año no es divisible entre 4 no es bisiesto.
	         return false;
	      }
		}
	}
	public boolean AnnoBisiestoGood(Calendar fecha){
		return (fecha.YEAR % 4 == 0) && !(fecha.YEAR % 100 == 0 && fecha.YEAR % 400 != 0);
	}
}


Esta es una parte del problema que intentare tener terminado a lo largo de la semana. La otra semana un compañero me planteo un problema que en un principio parece sencillo y es saber si estamos a lunes o a martes, algunos me dirán que eso ya lo hace de manera automática las librerías, pero que pasa si lo que quieres es extrapolarlo a otros entornos que no disponen de estas librerías, ¿alguno sabría hacerlo?, por eso me lo he planteado.

El problema de los test mal planificados.

0 comentarios

Muy a menudo en nuestro día a día podemos encontrarnos que el trabajo no esta del todo bien planificado, pero lo normal es conseguir sacar el trabajo y seguir para adelante sin mirar atrás. Ese no es mi caso, me encuentro en un proyecto con una gran envergadura en el que estamos involucrados más de 300 personas, donde el caos reina en cada esquina y en cada linea de codigo, tanto es así que en estos momentos estoy realizando las pruebas unitarías usando una herramienta denominada JUnit de la cual en otro momento explicare alguna cosa.
El problema en este caso es que estos test se estan efectuando sobre los servicios, los cuáles son un nodo de interconexión entre la BBDD y el código Java. A estas alturas del proyecto los servicios deberían ser definitivos y no tocarse, la realidad es muy diferente, los servicios estan en continua evolucion hasta el punto de pasar de un solo @autowired a cinco lo que nos lleva a pasar de dos pruebas a un mínimo de diez.Lo peor de este tema es que los jefes han olvidado que sucede en este tipo de tarea cuando todavía esta viva y es que el resultado que puedes esperar como mucho es de mantenimiento, siempre habrá un servicio que sera modificado y eso es lo que me duele, que siendo yo el unico  que realiza esta tarea de mi grupo se me señale con el dedo y me digan que no hay resultados.Por poner un ejemplo, el viernes cuando me fui deje el modulo al 74% , hoy nada más comenzar el día he sincronizado todo el proyecto y ese modulo se encontrarba al 40%. Falta matizar que siempre sincronizo antes de subir nada, me encanta asegurarme de que lo que subo no fastidia a nadie.La solución para este tipo de problemas es fácil, se puede realizar de dos maneras; una sería el posponer la realización de los mismos, pero como esto no puede ser pasamos a la segunda que sería tan básica como que cada programador se ocupara siempre de su test, de esta manera nos ahorraríamos sorpresas inesperadas como la que he tenido esta mañana, todos aprenderíamos y los test se realizarían mucho más exacto.

Buscador de iconos

0 comentarios



Hoy he podido encontrar un servicio de buscador de iconos, cierto es que google te permite buscar también iconos pero en el caso de este buscador sabes que todos son gratuitos, incluso dispone de un desplegable con el que se puede ver toda la codificación del archivo incluida la licencia bajo la que trabaja.

La búsqueda se puede filtrar por tamaño, por licencia y lógicamente por nombre, dispone de la opción de modificar el background de las imágenes para poder ver si son o no transparente.

Lo mejor es que cuando has encontrado el icono que querías al seguir el link te da no solo el tamaño que habías solicitado si no que te muestra en cuantos tamaños más lo tiene.

Todo un hallazgo que vale la pena visitar como mínimo una vez http://www.iconfinder.com.

Uso de fechas con Oracle

0 comentarios

Me doy cuenta de que hace mucho que no escribo nada por aquí. De igual manera he visto que no doy nunca un monográfico sobre algo.
Bueno, todo eso cambia hoy, mi primer monográfico es sobre el uso de las fechas dentro de Oracle

Lo primero que se tiene que conocer son los rangos máximos por lo que se puede mover uno, el tramo por el que nos podemos mover es el comprendido entre el -4713 AC hasta el 9999DC

Una manera muy sencilla de conseguir extraer la fecha seria con el comando:

SELECT sysdate FROM dual;

Con el uso de la función ADD_MONTHS podemos añadir o quitar meses a una fecha dada.

SELECT ADD_MONTHS(sysdate,1) FROM dual;

La función ADD_MONTHS contiene dos parámetros, el primero hace referencia a una fecha dada, en mi caso uso sysdate pero se puede usar cualquier cosa. El segundo parámetro es el que nos definirá cuantos meses se avanzan o retroceden.

Con el uso de la función LAST_DAY podemos averiguar cual seria el ultimo día del mes que le pasemos como parámetro

SELECT LAST_DAY(sysdate) FROM dual;

Con la función NEXT_DAY podemos averiguar que día sera el próximo domingo o en que cayo el siguiente domingo de una fecha dada.

SELECT NEXT_DAY(sysdate,'domingo') FROM dual;

En este caso siempre me ha surgido una duda, por que la búsqueda depende muchísimo del entorno en el que se ejecuta, por que vamos que 'Sunday' es lo mismo en concepto que 'domingo' pero no se escribe igual y la búsqueda se esta haciendo con un string. Motivo por el que no recomiendo el uso de esta característica si no se esta seguro que la base de datos siempre va a estar en un mismo idioma o en caso contrario se pueda tener este string lo suficientemente controlado como para que se cambie inmediatamente

Con la función MONTHS_BETWEEN podemos comprobar los meses que transcurren entre dos fechas determinadas.

SELECT months_between('3/06/08','5/01/09') FROM dual;

En este caso tenemos que tener cuidado de que la primera fecha sea siempre inferior a la segunda

Con la función TRUNC nos dirá el primer día correspondiente a lo que le pasemos en el segundo parámetro

SELECT trunc(sysdate,'year') FROM dual;

Con el mes, devolvería el primer día del mes y con el día el primer día de la semana

Con la función ROUND nos redondeara las fechas de igual manera que lo puede hacer con los numeros.

SELECT round(sysdate,'year') FROM dual;

Con la función CURRENT_DATE podremos observar la fecha actual.

SELECT CURRENT_DATE FROM dual;

Con la función SYSTIMESTAMP podremos observar la fecha actual, seria igual que la anterior función pero en este caso nos devuelve todos los datos.

SELECT SYSTIMESTAMP FROM dual;

Devuelve todo el formato de la fecha (20/06/11 12:41:33,296000 +01:00)

Con la función EXTRACT podremos extraer un dato de la fecha

SELECT extract(year FROM date '1998-03-07') FROM dual;

Podemos sustituir year por month o day.
También podemos obtener horas, minutos o segundos de la misma forma

SELECT extract(hour FROM time '06:07:04') FROM dual;

Gestion de errores en JQuery

0 comentarios

Un error que me he encontrado haciendo un pequeño desarrollo, este desarrollo comenzaba en una pagina HTML y derivaba hacia un servlet de Java, si tenemos en cuenta que el servicio java tiene unos time outs configurados y que este servlet tiene una integración con tres bases de datos tenemos que no se podía controlar íntegramente por el time out.

Por ese motivo se creo un sistema de errores para mostrar un mensaje de time out.


$.ajax({
data: params,
type: "POST",
url: action,
timeout: 30000,//Aquí le indicamos cuanto tardara en saltar el error en este caso 30 seg.
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
dataType: 'xml',
success: 
function(xml){
   $('input, select').removeAttr('disabled');
    $('a').css('color', 'red');
    
   $('p:first').html(
    $('#messages p#respuesta_'+$('respuesta',xml).text()).html()
   );
   $('form.clicktocall, input.volver').css('display', 'none');
   if($('#messages p#respuesta_'+$('respuesta',xml).text()).attr('class')=="ms")
    $('input.volver').css('display', 'inline'); 
   $('.clicktocall_form').fadeTo('slow',1);
   $('.thickbox-clicktocall').attr('class', 'thickbox-clicktocall thickbox-clicktocall-respuesta');
   $('.clicktocall-respuesta').fadeIn('slow');
 },
 error: //Pasados los 30 seg. saltaria este error
  function( objAJAXRequest, strError ){
   $('input, select').removeAttr('disabled');
    $('a').css('color', 'red');
    
   $('p:first').html($('#messages p#respuesta_error'));
   $('form.clicktocall, input.volver').css('display', 'none');
    $('input.volver').css('display', 'inline'); 
   $('.clicktocall_form').fadeTo('slow',1);
   $('.thickbox-clicktocall').attr('class', 'thickbox-clicktocall thickbox-clicktocall-respuesta');
   $('.clicktocall-respuesta').fadeIn('slow');
 
  }
});

Lógicamente aquí veis que faltan los datos que se muestran en cada momento, pero lo que nos interesa es el tratamiento del error, aunque parezca raro dentro de la parte de error tenemos una función "function( objAJAXRequest, strError )" que es necesario que lleve estos dos parámetros, hice pruebas con diferentes parámetros, pero el resultado no fue el deseado.

Calculadora básica en Android

0 comentarios

Seguimos haciendo lo básico de la programación, en este caso es un código que le he repasado a kabalt ya que no le funcionaba, lo subo yo por que soy la única persona activa de este blog.

Se trata de una calculadora muy básica suma, resta, multiplica, divide y hace potencias, nada del otro mundo. El problema es que esta persona trabaja desde hace años en host, con PL1 o Cobol y claro, todo lo que es la POO se le ha olvidado del todo, acepto el moverse en el mundillo de Android para recuperar un poco lo que es la lógica de la programación orientada a objetos, no es que yo sea un lumbreras en todo esto pero bueno, tampoco lo desconozco, como siempre os dejo el código y una pequeña captura de pantalla para que comentéis que os parece.

public class textobox extends Activity 
{
/*private EditText Minumero;*/

private EditText Miresultado;

public boolean operando = false;

public int num;
public char operacion = ' ';
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


/* Minumero =(EditText) findViewById(R.id.numero); */
Miresultado=(EditText) findViewById(R.id.Resultado);
/* Identificadores de los botones suma, resta, multiplica y divide */
Button Suma = (Button) findViewById(R.id.Sumar);
Button Resta = (Button) findViewById(R.id.Restar);
Button Multiplica = (Button) findViewById(R.id.Multiplicar);
Button Divide = (Button) findViewById(R.id.Dividir);
Button Mostrar = (Button) findViewById(R.id.Mostrar);
Button Reset = (Button) findViewById(R.id.Reset);
Button Quadrado = (Button) findViewById(R.id.Quadrado);
/* declaramos variable auxiliar para las operaciones */

/* acciones onclick para cada boton */
try{
Suma.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
if(!operando){
num = Integer.parseInt(Miresultado.getText().toString());
operacion = '+';
operando = true;
}else{
num = num + Integer.parseInt(Miresultado.getText().toString());
operacion = '+';
}
Miresultado.setText(null);
}
});
Resta.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
if(!operando){
num = Integer.parseInt(Miresultado.getText().toString());
operacion = '-';
operando = true;
}else{
num = num - Integer.parseInt(Miresultado.getText().toString());
operacion = '-';
}
Miresultado.setText(null);
}
});
Multiplica.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
if(!operando){
num = Integer.parseInt(Miresultado.getText().toString());
operacion = '*';
operando = true;
}else{
num = num * Integer.parseInt(Miresultado.getText().toString());
operacion = '*';
}
Miresultado.setText(null);
}
});
Divide.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
if(!operando){
num = Integer.parseInt(Miresultado.getText().toString());
operacion = '/';
operando = true;
}else{
num = num / Integer.parseInt(Miresultado.getText().toString());
operacion = '/';
}
Miresultado.setText(null);
}
});
Quadrado.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
if(!operando){
num = Integer.parseInt(Miresultado.getText().toString());
operacion = 'C';
operando = true;
}else{
double numero = Math.pow((double)num,Double.parseDouble(Miresultado.getText().toString()));
num=(int)numero;
operacion = 'C';
}
Miresultado.setText(null);
}
});
Mostrar.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
if(!operando){
Miresultado.setText(opera(num,Integer.parseInt(Miresultado.getText().toString()),'*'));
operacion = '=';
}else{
Miresultado.setText(opera(num,Integer.parseInt(Miresultado.getText().toString()),operacion));
operacion = '=';
}
operando = false;
}
});
Reset.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
num = 0;
operacion = ' ';
operando = false;
Miresultado.setText("");
}
});
}catch(Exception e){
num = 0;
operacion = ' ';
operando = false;
Miresultado.setText("Error");
}
}

public String opera(int x, int y, char operacion){
String num;
switch(operacion){
case '+':
num = ""+(x+y);
break;
case '-':
num = ""+(x-y);
break;
case '/':
num = ""+(x/y);
break;
case '*':
num = ""+(x*y);
break;
case 'C':
double numero = Math.pow((double)x,(double)y);
num=""+numero;
break;
default:
num = "Tipo de operación no soportado";
break;
}
return num;
}
}



 



image

Segundo intento con Android

0 comentarios

Bueno, siguen siendo cosas básicas y prácticamente copiadas de internet, pero por algún lado se tendrá que empezar.

En este caso se ha creado un programa que tiene un menú, este menú tiene dos opciones, la primera hace que aparezca un texto y la segunda borra este texto. Sigue siendo todo estatico pero no esta del todo mal :)

imageimageimage  4. imageimage 

image