• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Logica de negocios
 

Logica de negocios

on

  • 339 views

 

Statistics

Views

Total Views
339
Views on SlideShare
335
Embed Views
4

Actions

Likes
0
Downloads
4
Comments
0

2 Embeds 4

http://logicanegocio.blogspot.com 3
http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Logica de negocios Logica de negocios Document Transcript

    • LOGICA DE NEGOCIOS<br />Este paquete se encargará exclusivamente de las restricciones y validaciones requeridas por el software, estas restricciones deben ser tratadas de manera cautelosa ya que si no las tomamos en cuentas pueden causar daños en el software, haciendo que el software no pueda ejecutarse.<br />En este paquete hemos considerado necesario la creación de nueve clases, estas clases funcionaran de una manera que el usuario al momento de cometer un error el software se encargará de tratarlo, aquí se manejaran las excepciones que serán resueltas en un nivel superior, en la respectivas clases de las que son invocadas. Las excepciones serán manejadas en este software mediante las instrucciones Try y Catch.<br />Las clases a utilizar en este paquete son: GESTION NOTAS, CALCULADORA, APOSTFIJA, NOTAS, OPERACIONES, PILAS, PILARESULTADO, REEMPLAZO Y VALIDAR. A continuación haremos una descripción de las clases antes mencionadas <br />Clase Gestion Notas<br />Comenzaremos con la clase GESTION NOTAS, esta clase ha sido creada para manejar las excepciones antes mencionadas, aquí crearemos ocho métodos los cuales son: Consultar Alumnos, Consultar Cursos, Registrar Alumno, RegistrarCurso, ModificarAlumno, ModificarCurso, EliminarAlumno y EliminarCurso. Para la creación de estos métodos, ha sido necesario importar los paquetes: Entidades (Alumno y Curso) y Acceso a Datos (TablaAlumno y TablaCurso) además la librería de java, ya que también utilizaremos listas. Todos estos métodos mencionados anteriormente utilizaran las excepciones try y catch, cada uno de estos métodos se encargara de retornar los métodos creados por el paquete acceso a datos, tanto para alumnos y cursos los cuales son: Seleccionar, Insertar, Actualizar y eliminar. <br />Ahora explicaremos la clase Notas. En esta clase se ha debido importar los paquetes java.util.ArrayList, java.util.List. Además hemos declarado una variable tipo String llamada “frase”, y luego el respectivo constructor de la clase, esta variable(frase) será utilizada por los métodos de esta clase, los cuales son: almacen, cadanota, esnumero, posiciónoperador, igualnota, búsqueda y listaauxiliar. <br />Empezaremos explicando el método almacén, en el cual se ha utilizado la variable “frase”, la misma que será instanciada con la formula, luego hemos creado dos variables, una tipo String llamada “exa” (inicializada como vacía) y otra variable “examen” que será un vector tipo String (el cual será del tamaño de la frase ingresada), además de un contador “k” (inicializado en cero). En el respectivo código estamos inicializando un bucle con la instrucción “for” para recorrer la frase, luego con la instrucción condicional “if” se compara los caracteres de la frase recorrida para verificar si estos son letras entre A y Z. Si se cumple esta condición entonces se evalúa una nueva, también con “if” para verificar si la posición siguiente en la frase es un número (para esto se implemento el método esnumero), si esto se cumple entonces a la variable “exa” se le atribuye la subcadena de la frase desde la posición “i” hasta “posicionoperador(i)” (para esto se implemento el método posicionoperador) y luego al vector “examen” en la posición “k” le pasamos el valor de la variable “exa” y a la posición “i” la dejamos en “posicionoperador(i)-1”. De con cumplirse esta ultima condición (si no es número) entonces a la variable “exa” se le atribuye la subcadena de la frase desde la posición “i” hasta “i+1” y luego al vector “examen” en la posición “k” le pasamos el valor de la variable “exa”. De no cumplirse la primera condición (si la frase no contiene caracteres entre A y Z) entonces a la variable “exa” le asignamos vacio (“”) y a la variable “k” la aumentamos en uno. Finalmente este método nos retornara la variable vector “examen”.<br />El método esnumero es para verificar si el carácter ubicado en una determinada posición es un número. Así este método tipo boolean nos devolverá un valor de verdad. En su código podemos ver que hemos creado la variable tipo carácter “numero”, luego con la instrucción condicional “if” verificamos que la variable “numero” este ente los valores 0 y 9. De tal forma si se cumple esta condición retornara el valor de verdad “true” y de no cumplirse retornara el valor “false”.<br />El método posicionoperador es para verificar la posición de un operador en la frase. Así este método de tipo “int” nos retornara un valor tipo entero (“a”). Hemos creado las variables tipo enteras “posicion” y “a”, de las cuales hemos asignado a la variable “a” el tamaño de la frase. En su código podemos ver que hemos inicializado un bucle con la instrucción “for”, en el cual al contador “i” le hemos asignado la variable entera “posicion”, luego recorremos la frase, y mediante una instrucción condicional “if” verificamos que la subcadena de la frase en la posición (i,i+1) pueda ser igual a “+, -, *, /, (, )” para luego asignarle a la variable “a” la posición “i”, y hacer un quiebre de bucle con la instrucción “break”. Finalmente el método nos retornara la variable “a”. <br />El método cadanota es para verificar los caracteres de la frase que forman una nota. Así este método que es una “lista” nos devolverá la lista (“resultado”). Hemos creado una lista tipo array “resultado” y un vector tipo String “examen”, al cual le hemos asignado el vector del método almacen. En su código podemos ver que hemos inicializado un bucle con la instrucción “for”, para recorrer la frase y mediante una instrucción condicional “if” verificamos que el vector “examen” en la posición “i” sea diferente de nulo(que no se encuentre vació), si se cumple esta condición entonces se agrega “examen” en la posición “i” a la lista tipo array “resultado”. Finalmente retornaremos la lista “resultado”. <br />El método búsqueda es para realizar una determinada búsqueda de una nota en la lista, este método se esta declarando como booleano, aquí hemos dado como parámetros una lista tipo String “lista” y una variable String “nota”, además se esta creando una variable tipo boolean “a” (inicializada en false). En su código podemos ver que hemos inicializado una instrucción “for” para recorrer la lista y mediante una instrucción condicional “if” se esta comparando si una nota ingresada es igual a la que se encuentra en la posición de la lista, si se cumple esta condición a la variable “a” se le asigna el valor de verdad “true”. Finalmente el método nos retornara la variable “a”.<br />El método listaauxiliar, el cual se esta declarando como una lista tipo string, aquí hemos dado como parámetro un entero “posicion”, además se esta declarando una lista tipo String “resultado”, a la cual le asignamos el método cadanota y también una lista tipo array “aux”. En su código podemos ver que hemos inicializado una instrucción “for” para recorrer la lista “resultado” y mediante una instrucción condicional “if” se esta comparando si el contador “i” es igual al de la variable posicion, de no ser igual entonces agregara a la lista “auxi” la lisa resultado en la posicion “i”. Finalmente este método retornara la lista “aux”. <br /> <br />El método igualnotas es para verificar si existen notas iguales dentro de la lista auxiliar, en este método se hace un llamado a busqueda y listaauxiliar. Aquí se ha creado una lista tipo String “resultado”, a la cual le asignamos el método cadanota y también una lista tipo array “aux”. en el codigo podemos ver que hemos inicializado una instrucción “for” para recorrer la lista “resultado”, luego hemos asignado a la variable “aux” el método listaauxiliar con el parámetro indicador de posicion “i”, y mediante una instrucción condicional “if” hemos llamado al método busqueda para verificar si el valor de la lista aux para resultado.get(i) es igual a “true”, de cumplirse esta condición el valor de la variable “notasiguales” le asignamos el valor “true” y hacemos un quiebre de ciclo con la instrucción “break”. Finalmente este método nos retornara la variable “notasiguales”.<br />Siguiendo con las clases ahora explicaremos la clase operaciones. . En esta clase no se ha importado ningún paquete. Hemos declarado tres variables tipo double “x, y, respuesta” y una variable tipo String llamada “letras”, además de su respectivo constructor. Hemos considerado la creación de cuatro métodos, los cuales son: suma, resta, producto, division. En todos estos metodos se realiza una operación respectiva(+, -, *, /) y retorna una variable respuesta. Como todos tienen la misma logica vamos a explicar solo uno de ellos.<br />El método suma se encargara de realizar el proceso de suma entre las variables “x” y “y”, para luego asignarlo a una variable resultado y finalmente retornando esta.<br />Ahora veremos la clase calculadora, en esta clase hemos importado los paquetes Entidades.Nota, java.util.ArrayList;, java.util.List y seran usado según la necesidad de los metodos, los cuales son: EsCorrecto, DeterminarTiposEvaluacion y Calcular. <br />Empezaremos explicando el metodo EsCorrecto, este metodo es de tipo boolean y tiene como parámetro la variable tipo String “Expresion” . Básicamente el metodo consistira en retornarnos que la expresión esta correcta.<br />Seguiremos con el metodo DeterminarTiposEvaluacion, el cual es una lista tipo String con su parámetro “Expresion”. Se ha creado una variable lista tipo String “resultado”, luego se ha creado el objeto “obj” de la clase notas y se le ha dado como parámetro la variable “Expresion”, después a la variable resultado se le ha asignado el objeto “obj” que ha llamado al metodo cadanota, de la clase notas. Finalmente este metodo nos retornara la lista “resultado”.<br />Finalmente veremos el método Calcular, este método es de tipo Double y se le ha asignado los parámetros “Expresion” y “Notas”. Se ha inicializado una variable “resultado” de tipo double con el valor 0,0 para ser reconocida. Luego se ha creado una lista tipo String “notitas” en la cual se almacenaran todas las notas del modelo de la tabla, tambien se han creado una variable tipo double “a” inicializada en 0. En el código podemos observar que hemos inicializado una instrucción “for” para recorrer la lista Notas, luego con una instrucción condicional “if” verificamos si la nota es menor que cero o mayor que 20, si se cumple esta condición agregamos a la lista “notitas” el valor 0, de no cumplirse entonces agregamos la nota a la lista “notitas”.<br />Teniendo la lista notitas, creamos un objeto “ennumeros” de la clase remplazo con los parámetros “notitas” y ”Expresion” , luego le asignamos a una variable String “num” el objeto ennumeros con el metodo mejorado e imprimimos la variable “num”. Siguiendo el codigo se ha creado el objeto “posfija” de la clase aposfija y se le ha asignado a la variable String “pos” este objeto con el metodo resultado para luego imprimir la variable “pos”. Finalmente se ha creado el objeto “res” de la clase pilaresultado con el parámetro “pos” para luego asignar a la variable “resultado” el objeto “res” con el metodo PilaVacia2 convertido a tipo de dato double, para al final retornar esta variable.<br /> <br />CLASE VALIDAR <br />En esta clase se comprueba la formula si esta semántica y sintácticamente correcta, para empezar se ha declarado una variable global “frase” la cual se utilizara para instanciarla por medio del constructor:<br />public validar(String frase) {<br /> this.frase = frase;<br />}<br />Después del constructor se ha creado una clase llamada validación en la cual retornará si la frase esta correctamente escrita o no, en este caso luego se llamara este método para verificar si la formula esta correctamente escrita:<br />public boolean validacion(){<br /> if(hay()==true){<br /> if(parentesis()==true){ <br /> pila Obj =new pila(frase);<br /> if(Obj.Pila()==true){<br /> return conparentesis();<br /> }else{<br /> return false;<br /> }<br /> }<br /> else{<br /> return sinparentesis();<br /> }<br /> }else{<br /> return false;<br /> }<br /> }<br />En este método se ha llamado a otras funciones como “hay()”, la cual devuelve si es que la frase tiene operadores y notas, además el método “paréntesis” devuelve si hay una cantidad par de paréntesis, para luego crear un objeto “Obj” de la clase “Pila()” la cual contiene una pila con sus correspondientes métodos que devuelve si la frase esta correctamente escrita con sus paréntesis:<br />public boolean Pila(){<br /> boolean retornar=true;<br /> for (int i = 0; i < frase.length(); i++) {<br /> if(frase.substring(i,i+1).equals("(")){<br /> agregar(1);<br /> }<br /> if(frase.substring(i,i+1).equals(")")){<br /> if(pop()==true){<br /> }else{<br /> retornar=false;<br /> break;<br /> }<br /> }<br /> }<br /> return retornar;<br /> }<br />Luego colocamos una sentencia “if ” que divide cuando hay y no hay paréntesis : “conparentesis()” y “sinparentesis()”:<br />En estos dos métodos se usara el proceso de recursividad por cuestiones didácticas explicare el primer método “sinparéntesis()”, en esta podemos mencionar que hemos considerado un algoritmo recursivo que llama a diversos métodos: <br />private boolean EsLetra(String expresion, int posicion){<br />}=>>>En este método inicializa la recursividad puesto que en la expresión debe o bien comenzar con una letra o bien con un numero no puede comenzar de otra forma, este método llama a los siguientes. Luego aumenta la posición en que se encuentra y llama a los métodos recursivos como son que en el caso de que en la posición siguiente puede haber un operador, un numero, y un terminador el cual le hemos asignado un “;” para poder terminar el bucle, los siguientes métodos muestran lo que le continua por ejemplo:<br />Los siguientes métodos recursivos <br />private boolean EsOperador(String expresion, int posicion){<br />}=>>>Este Método devuelve recursivamente verdad o falsedad si al que le continua son:<br />Una letra o un numero con su respectivo método. <br />private boolean EsNumero(String expresion, int posicion){<br />} =>>>Este Método devuelve recursivamente verdad o falsedad si al que le continua son:<br />Un numero, un punto, un operador un terminador con su respectivo método. <br />private boolean EsPunto(String expresion,int posicion){<br />}=>>>Este Método devuelve recursivamente verdad o falsedad si al que le continua son:<br />Es un numero con su respectivo método. <br />private boolean EsTerminador(String expresion, int posicion){<br />}=>>>Este Método devuelve recursivamente verdad o falsedad si al que le continua son:<br />En este caso el “;”.<br />En el método de conparentesis() igual se generan los métodos pero teniendo en cuenta por ejemplo que a un paréntesis cerrado no le puede seguir ni una nota ni un numero, y que necesariamente debe ser un operador <br />CLASE NOTA<br />En este clase igual que las demás clases se crea un constructor para después instanciarlo este clase nota esta compuesta por dos métodos principales el primero almacen() que devuelve todas las notas que se encuentran en la frase en este caso las notas de la formula en un Array y el otro método convierte este array en una lista para su mejor uso.<br /> public String[] almacen(){<br /> frase=frase.toUpperCase();<br /> String exa="";<br /> String examen[] = new String[frase.length()];<br /> int k=0;<br /> for (int i = 0; i < frase.length(); i++) {<br /> if( frase.charAt(i) == 'A' || frase.charAt(i) == 'B'||<br /> frase.charAt(i) == 'C' || frase.charAt(i) == 'D'||<br /> frase.charAt(i) == 'E' || frase.charAt(i) == 'F'||<br /> frase.charAt(i) == 'G' || frase.charAt(i) == 'H'||<br /> frase.charAt(i) == 'I' || frase.charAt(i) == 'J'||<br /> frase.charAt(i) == 'K' || frase.charAt(i) == 'L'||<br /> frase.charAt(i) == 'M' || frase.charAt(i) == 'Ñ'||<br /> frase.charAt(i) == 'N' || frase.charAt(i) == 'O'||<br /> frase.charAt(i) == 'P' || frase.charAt(i) == 'Q'||<br /> frase.charAt(i) == 'R' || frase.charAt(i) == 'S'||<br /> frase.charAt(i) == 'T' || frase.charAt(i) == 'U'||<br /> frase.charAt(i) == 'V' || frase.charAt(i) == 'W'||<br /> frase.charAt(i) == 'X' || frase.charAt(i) == 'Y'||<br /> frase.charAt(i) == 'Z'){<br /> if(esnumero(frase.charAt(i+1))){<br /> exa=exa+frase.substring(i, posicionoperador(i));//;i+2);<br /> examen[k]=exa;<br /> //i=i+1;<br /> i=posicionoperador(i)-1;<br /> }<br /> else{<br /> exa=exa+frase.substring(i, i+1);<br /> examen[k]=exa;<br /> }<br /> }<br /> else{<br /> exa="";<br /> k=k+1;<br /> }<br /> }<br /> return examen;<br /> }<br /> public List<String> cadanota(){<br /> List<String> resultado = new ArrayList();<br /> String examen[] = almacen();<br /> for (int i = 0; i < frase.length(); i++) {<br /> if(examen[i]!=null){<br /> resultado.add(examen[i]);<br /> }<br /> }<br /> return resultado;<br /> } <br /> La algoritmo utilizado en el primer método es el de crear un array “examen[]” de la longitud de la “frase”, luego se recorre la frase si encuentra una letra que la almacene en el array desde esta posición hasta la posición del siguiente operador para lo cual hemos utilizado el método posición operador()<br /> public int posicionoperador(int posicion){<br /> int a=frase.length();<br /> for (int i = posicion; i < frase.length(); i++) {<br /> if(frase.substring(i, i+1).equals("+")||frase.substring(i, i+1).equals("-")||frase.substring(i, i+1).equals("*")||<br /> frase.substring(i, i+1).equals("/")||frase.substring(i, i+1).equals("(")||frase.substring(i, i+1).equals(")")){<br /> a=i;<br /> break;<br /> }<br /> }<br /> return a;<br /> }<br />Para dar una mejor efectividad al programa he creido realizar tres funciones mas: igualnotas(), busquedad(List<String>lista, String nota), listaauxiliar(int posicion), maximo():<br /> public boolean igualnotas(){<br /> boolean notasiguales=false;<br /> List<String> resultado =cadanota();<br /> List<String> aux = new ArrayList();<br /> for (int i = 0; i < resultado.size(); i++) {<br /> aux=listaauxiliar(i);<br /> if(busquedad(aux,resultado.get(i))==true){<br /> notasiguales=true;<br /> break;<br /> }<br /> }<br /> return notasiguales;<br /> }<br />En este método creamos una lista del método realizado con anterioridad “cadanota()” luego recorreremos esta lista y por cada nota crearemos una lista auxiliar con el método listaauxiliar() con el fin de con el método busquedad(aux, resultado.get(i)) devuelva si exite una lista igual.<br />Luego finalmente con el método máximo() se ha realizado un testeo con la nota 20 se ha creado una lista y se ha efectuado con la formula:<br />public boolean maximo(){<br /> double veinte;<br /> List<String> resultado =cadanota();<br /> List<String> aux =new ArrayList();<br /> for (int i = 0; i < resultado.size(); i++) {<br /> aux.add("20");<br /> }<br /> remplazo ennumeros=new remplazo(aux,frase);<br /> String num=ennumeros.mejorado();<br /> aposfijaa posfija=new aposfijaa();<br /> String pos=posfija.resultado(num);<br /> pilaresultado res=new pilaresultado(pos);<br /> veinte=Double.parseDouble(res.PilaVacia2());<br /> if(veinte==20){<br /> return true;<br /> }<br /> else{<br /> return false;<br /> }<br /> } <br />Como se puede observar se ha creado un objeto con la clase remplazo la cual con la lista de notas de 20 ha sido remplazado en la formula por las notas,<br />Luego se ha instanciado un objeto con la clase aposfijaa y este a su vez en pilaresultado() el cual efectuara la formula hecha números en posfija y posteriormente su resultado.<br />Si el resultado es 20 significa que la formula esta correctamente escrita de no ser así esta incorrecta.<br />CLASE PILARESULTADO<br />En esta clase se resuelve la formula escrita en posfija para el resultado final de la operación:<br /> public String PilaVacia(){<br /> String operando1;<br /> String operando2;<br /> String simbolo;<br /> double valor=0;<br /> <br /> String acumulador="";<br /> for (int i = 0; i < frase.length(); i++) {<br /> simbolo=frase.substring(i, i+1);<br />if(operando(simbolo)==true){<br /> acumulador=acumulador+simbolo;<br /> <br /> }else{<br /> if(simbolo.equals(" ")){<br /> if(!acumulador.equals("")){<br /> agregar(acumulador);<br /> acumulador="";<br /> }<br /> }else{<br /> if(!simbolo.equals(" ")&&vec.length>1){<br />operando1 = pop();<br />operando2 = pop();<br /> Operaciones op= new <br />operaciones(Double.parseDouble(operando2),Double.parseDouble(operando1));<br /> <br /> f (simbolo.equals("+")) {<br /> valor=op.suma();<br /> } <br />if (simbolo.equals("-")) {<br /> valor=op.resta();<br /> } <br />if (simbolo.equals("*") ){<br /> valor=op.producto();<br /> } <br />if (simbolo.equals("/")) {<br /> valor=op.division();<br /> } <br />agregar(Double.toString(valor));<br /> <br /> }<br /> }<br />}<br />}<br />}<br />En este método recorremos la expresión si encuentra un operando este que lo vaya acumulando.<br />Si no, si encuentra un vacío que extraiga de la pila los operadores y según su operación ejecutar con estos operadores la operación correspondiente.<br />Al Final se retornará el único elemento de la pila que será el resultado de la operación, que vendría hacer el promedio.<br /> <br />CLASE APOSFIJA<br />Esta clase llamada posfija se encargará de convertir la formula de inflija a postfija, que es mejor trabajarlo así.<br />Empezaremos por crear un dato de tipo string llamado encontradas que será una variable de tipo global y nos devolverá el resultado evaluado o convertido.<br />Luego creamos el método resultado que se encargará de devolvernos el resultado de tipo string y este método recibe de parámetro expresion. Hemos importado la pila de la librería java para facilitarnos su uso, ya que habrá dos pilas una donde guardara los números y la otra los operadores, entonces creamos un objeto llamado PilaNumeros y PilaOperadores respectivamente de la clase Stack() . La expresion la pasamos a mayúsculas y la guardamos en “exp”, declaramos un dato de tipo string llamado fragmento se encargará de guardar el fragmento de texto que se esté utilizando en el momento (ya sea un número, un operador, etc.), un dato de tipo int llamad “posicion” y “tamaño”, se encargaran de la posicion del carácter que se esta procesando actualmente y del tamaño del texto que se procesa en este momento respectivamente y un dato de tipo int llamado “cont” que se encargará de contar, indica el número de caracteres que se sacan del string en un momento indicado, este no puede ser más de cuatro (la función con más caracteres). <br />public class aposfija El nombre de nuestra clase<br />private String encontadas;<br /> public String resultado(String expresion){<br /> Stack PilaNumeros=new Stack();<br /> Stack PilaOperadores= new Stack();<br /> String expr=expresion.toLowerCase();<br /> String fragmento; <br /> int pos=0, tamaño=0;.<br /> int cont=1;<br /> String funciones []={"1 2 3 4 5 6 7 8 9 0 ( ) x + - * /"}<br /> String parentesis="(";<br /> int anterior=0;<br />Comenzamos a recorrer la expresion, luego validamos si la suma de pos mas cont sea menor o igual al tamaño de la expresion y utilizamos el indexOf, hace que a cada elemento del array llamado funciones si hay el número de ocurrencias es por que será diferente de “-1”, si no, quiere decir que no hay ocurrencias; si esto es correcto entonces tamaño es igual a cont y este se irá incrementando.<br /> for (int i = 0; i < expr.length(); i++) {<br /> tamano=0;<br /> cont=1;<br /> if (tamano==0 && cont<=1){ //Este while revisa si el pedazo del texto sacado concuerda con algo conocido<br /> if(pos+cont<=expr.length() && funciones[cont-1].indexOf(expr.substring(pos,pos+cont))!=-1){<br /> tamano=cont;<br /> }<br /> cont++;<br /> }<br />Si encontró algo, de tamaño uno, y otra condición donde llama al método EsNumero, que le pasas como parámetro el recorrido de la expresion desde pos hasta po+tamaño, si lo es, se encargara de sacarlo por completo. Dentro de la condición inicializamos el fragmento como vacío que es el acumulador, ya que será ahí donde se guardará el número sacado anteriormente con la instrucción do while, que haga mientras siga siendo número o punto que vaya concatenando y siga aumentando el pos, mientras pos sea menor que el tamaño de la expresión o sea igual a un punto o una coma. Luego hace el fragmento lo agrega a la pila de números, anterior se le asigna uno y el contador disminuye en uno.<br />Pero si no es número quiere decir que un operador, la cual puede ser una suma, resta, multiplicación o división; llama al método extraeOperadores que se encargará de que si el operador tiene menor prioridad del operador que se encuentra en la pila entonces va ir sacando los operadores de mayor prioridad hasta entrarlo en la pila, hay que tener en cuenta que va tener que llamar al método prioridad para que realice el cambio sucesivo hasta cuando encuentre uno que sea menor o igual. <br />Luego este método llamara al método extraerOperador se encargara de se sacar el operador que se va evaluar, si encuentra un operador saca dos elementos de la pila numeros y los guarda con el operador que fue evaluado a la PilaNumeros, pero hemos tenido que crear un objeto de la clase string debido a que vamos a concatenar los operadores con los espacios en blanco (Numeros.push(new String(a+" "+b+" "+operador)); ) y sino saca un elemento y lo concatena con el operador (Numeros.push(new String(a+" "+operador)).<br /> <br />if(tamaño==1){ //Si encontró algo de tamaño uno<br /> if(EsNumero(expr.substring(pos, pos+tamaño))){ //Si es un número se encarga de sacarlo completo<br /> fragmento=""; <br /> do{ <br /> fragmento=fragmento+expr.charAt(pos);<br /> pos++;<br /> }while(pos<expr.length() && Numero(expr.substring(pos,pos+tamano)) || expr.charAt(pos) == '.' || expr.charAt(pos) == ',' ));<br /> PilaNumeros.push(new String(fragmento));<br /> anterior=1;<br /> pos--;<br /> }else if (expr.charAt(pos)=='+' || expr.charAt(pos)=='*' || expr.charAt(pos)=='/' ){<br />ExtraeOperadores(PilaNumeros, PilaOperadores, expr.substring(pos, pos+tamano));<br /> anterior=2;<br /> }else if (expr.charAt(pos)=='-'){ //Si es una resta<br /> if(anterior==0 || anterior==2 || anterior==3){<br /> PilaNumeros.push(new String("-1"));<br /> ExtraeOperadores(PilaNumeros, PilaOperadores, "*");<br /> }else{//<br /> ExtraeOperadores(PilaNumeros, PilaOperadores, " -");<br /> }<br /> anterior=2;<br /> }else if (expr.charAt(pos)=='('){<br /> if (anterior==1 || anterior == 4){<br /> ExtraeOperadores(PilaNumeros, PilaOperadores, "*");<br /> }<br /> PilaOperadores.push(new String("("));<br /> anterior=3;<br /> }else if (expr.charAt(pos)==')'){<br /> while(!PilaOperadores.empty() && parentesis.indexOf(((String)PilaOperadores.peek()))==-1){<br /> ExtraeOperador(PilaNumeros, PilaOperadores);<br /> }<br /> if(!((String)PilaOperadores.peek()).equals("(")){<br /> PilaNumeros.push(new String(((String)PilaNumeros.pop()) + " " + ((String)PilaOperadores.pop())));<br /> }else{<br /> PilaOperadores.pop();<br /> }<br /> anterior=4;<br /> }<br /> }<br /> pos+=tamano;<br /> }<br /> //Procesa al final<br /> while(!PilaOperadores.empty()){ //Saca todos los operadores mientras la pila no esté vacía<br /> ExtraeOperador(PilaNumeros, PilaOperadores);<br /> }<br /> encontadas = ((String)PilaNumeros.pop()); //Se obtiene el resultado final<br /> return encontadas; //Se devuelve el resultado evaluado<br /> }<br />En este método se crea una tercera pila con el fin evaluar la expresion y dividirla por morfemas luego que la divide recorre los tokens, cada token representa un numero o un operador, en caso de ser un operador va a ejecutar la operación en caso q no llena la pila en la pila en la operación realizada y si no la llena en el Token. <br /> public double f(String expresionParseada, double x) {<br /> Stack pilaEvaluar = new Stack(); // Pila de doubles para evaluar<br /> double a, b; //Estos valores son los que se van sacando de la pila de doubles<br /> StringTokenizer tokens=new StringTokenizer(expresionParseada); //La expresión partida en tokens<br /> String tokenActual; //El token que se procesa actualmente<br /> while(tokens.hasMoreTokens()){ //Haga mientras hayan más tokens<br /> tokenActual=tokens.nextToken();<br /> if(tokenActual.equals("+")){//Si es una suma se sacan dos números y se suman<br /> b=((Double)pilaEvaluar.pop()).doubleValue();<br /> a=((Double)pilaEvaluar.pop()).doubleValue();<br /> pilaEvaluar.push(new Double(a+b));<br /> }else if(tokenActual.equals("-")){//Si es resta se sacan dos valores y se restan (así con todos los operadores)<br /> b=((Double)pilaEvaluar.pop()).doubleValue();<br /> a=((Double)pilaEvaluar.pop()).doubleValue();<br /> pilaEvaluar.push(new Double(a-b));<br /> }else if(tokenActual.equals("*")){//Multiplicación<br /> b=((Double)pilaEvaluar.pop()).doubleValue();<br /> a=((Double)pilaEvaluar.pop()).doubleValue();<br /> pilaEvaluar.push(new Double(a*b));<br /> }else if(tokenActual.equals("/")){//División<br /> b=((Double)pilaEvaluar.pop()).doubleValue();<br /> a=((Double)pilaEvaluar.pop()).doubleValue();<br /> pilaEvaluar.push(new Double(a/b));<br /> }else{//si es otra cosa tiene que ser un número, simplemente se mete en la pila<br /> pilaEvaluar.push(Double.valueOf(tokenActual));<br /> }<br /> }<br /> a=((Double)pilaEvaluar.pop()).doubleValue(); //El valor a devolver<br /> return a;<br /> }<br />Este método se va encargar de devolver la prioridad que será de tipo entero ya sea “0”, “1” ó “-1”ya que la multiplicación y división tienen prioridad sobre el “+” mas y gggg “-“.<br />private int prioridad(char s) {<br />if (s=='+' || s=='-') //Si es una suma o una resta devuelve cero<br />return 0;<br />else if (s=='*' || s=='/') //Si es multiplicación, división o resto de división devuelve uno<br />return 1;<br />return -1; //Si no fue nada de lo anterior devuelve -1<br />} <br />Este método se va encargar de devolver si es número o no, si lo es retornará true, sino false y recibirá como parámetro un s de tipo String. <br />private boolean EsNumero(String s) {<br /> boolean como = true;<br />if (s.equals("0") || s.equals("1") || s.equals("2") || s.equals("3") || s.equals("4") || s.equals("5") || s.equals("6") || s.equals("7") || s.equals("8") || s.equals("9")) //Si el caracter está entre 0 y 9 (si es un número) {<br />return como;<br />}else<br /> como=false;<br />}<br />return como;<br />}<br />private void ExtraeOperadores(Stack PilaNumeros, Stack PilaOperadores, String operador){<br />//Todas las funciones que se manejan como paréntesis de apertura<br />final String parentesis="(";<br />//mientras (While) la pila no esté vacía, el operador que sigue no sea un paréntesis de apertura, la longitud del operador sea uno (para que sea un operador), y la prioridad indique que tiene que seguir sacando elementos<br />while(!PilaOperadores.empty() && parentesis.indexOf((String) PilaOperadores.peek()) ==-1 && ((String)PilaOperadores.peek()).length()==1 && prioridad(((String)PilaOperadores.peek()).charAt(0))>=prioridad(operador.charAt(0))){<br />ExtraeOperador(PilaNumeros, PilaOperadores); //Saca el siguiente operador<br />}<br />PilaOperadores.push(operador);//Al final mete el nuevo operador luego de sacar todo lo que tenía que sacar.<br />}<br /> private void ExtraeOperador(Stack Numeros, Stack operadores) {<br />String operador,<br />String a; <br />String b;<br />String operadores="+ - * / "; //Lista de los operadores <br /> operador= (String) operadores.pop(); //Saca el operador que se debe evaluar<br />if(operadores.indexOf(operador)!=-1){ //Si es un operador saca dos elementos de la pila y guarda la operación<br />b=(String)Numeros.pop();<br />a=(String)Numeros.pop();<br />Numeros.push(new String (a+" "+b+" "+ operador));<br />}else{ //==>Sino sólo saca un elemento<br />a=(String)Numeros.pop();<br />Numeros.push(new String(a+" "+operador));<br />}<br />}//sacaOperador<br />