ESTUDIO DE LAS ESTRUCTURAS DE ÁRBOL EN JAVA
|
|
|
- Juan Antonio Soto Ortíz
- hace 10 años
- Vistas:
Transcripción
1 ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA DE TELECOMUNICACIÓN UNIVERSIDAD POLITÉCNICA DE CARTAGENA Proyecto Fin de Carrera ESTUDIO DE LAS ESTRUCTURAS DE ÁRBOL EN JAVA AUTOR: DIRECTOR: Esperanza Madrid Alcaraz. Mª Francisca Rosique Contreras. Julio 2012
2
3 Autor del Autor Director(es) Título del PFC Esperanza Madrid Alcaraz Mª Francisca Rosique Contreras ESTUDIO DE LAS ESTRUCTURAS DE ÁRBOL EN JAVA Descriptores Resumen La primera etapa de este proyecto se trataba de la implementación de un árbol multirrama o multicamino para su visualización a través de la consola del programa Eclipse como continuación a la parte de arboles estudiada en la asignatura Fundamentos de la programación. Como mejora se ha querido desarrollar una interfaz grafica para que la inserción, eliminación y visualización de los datos del árbol sea más clara, rápida y sencilla. El caso de estudio seleccionado se centra en la creación y gestión de un árbol genealógico ya que es un claro ejemplo de árbol multirrama donde a los padres existentes se les podrá añadir uno, dos o más hijos. Además se podrán eliminar dichos hijos y la visualización de los mismos. Titulación Departamento Fecha de Presentación Ingeniero Técnico en Telecomunicaciones, esp. Telemática Tecnologías de la Información y las Comunicaciones Julio
4
5 Índice General 1. Alcance y contenido Introducción Estructura del documento 8 2. Estructuras de datos Introducción a los arboles Orden de los nodos Recorridos de un árbol Recorrido en profundidad Recorrido en anchura Ventajas y desventajas Diagrama UML Orden de complejidad de los algoritmos Introducción Tiempos de ejecución Concepto de complejidad Ordenes de complejidad Complejidad en arboles Caso de estudio Titulo 19
6 5.2. Introducción Diseño inicial Implementación de la interfaz grafica Conclusiones Anexos Bibliografía y referencias 41
7
8 1. Alcance y contenido 1.1 Introducción Hasta ahora el análisis de estructura de datos se ha limitado a los arboles en que cada nodo tiene como máximo dos descendientes o hijos, es decir, a los arboles binarios. Esto resulta perfectamente apropiado si, por ejemplo, se quieren representar relaciones familiares en las que cada persona se encuentre relacionada con sus padres. Pero si la relación es a la inversa necesitamos una estructura que asocie a cada padre un número arbitrario de hijos. A estas estructuras se les llama arboles multicamino o n-arios. Este ultimo termino viene del ingles n-ary, donde n es el grado máximo de los nodos del árbol, por ejemplo, si n es igual a 2 al árbol se le llama binario, para n igual a 3 se le llama terciario, para n igual a 4 se llama cuaternario, y así sucesivamente. 1.2 Estructura del documento Este proyecto se divide en diferentes secciones con información detallada de los puntos más relevantes: Alcance y contenido: Se aporta una visión general del proyecto. Estructuras de datos: Se explica con detenimiento en que consisten los arboles en java. Diagramas UML: Se da información sobre el conjunto de herramientas para analizar y diseñar el programa. Orden de complejidad de los algoritmos: Se presentan los conceptos que utilizan los informáticos para analizar la eficacia de los algoritmos. Caso de estudio: Esta sección presenta un escenario que muestra cómo el programa interactúa para lograr un objetivo específico. Conclusiones: Se discuten los aspectos más importantes del proyecto. Anexos: Se incluye el código de Java con una explicación detallada. Bibliografía y referencias: Se dan a conocer los algunos de los libros de donde se ha extraído información para completar este proyecto.
9 2. Estructuras de datos 2.1 Introducción a los arboles. Un árbol es una estructura jerárquica de datos que imita la forma de un árbol, un conjunto de nodos conectados. Un nodo es la unidad sobre la que se construye el árbol y puede tener ceros o mas nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b si existe un enlace desde a hasta b. Solo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja y a los demás nodos se les conoce como ramas. Formalmente, un árbol se puede definir de manera recursiva, se utiliza la recursión para definir un árbol porque es una característica inherente a los mismos, como: 1. Un solo nodo es, por si mismo, un árbol. Ese nodo es también la raíz de dicho árbol. 2. Se supone que n es un nodo y que A 1, A 2,..., A k son arboles con raíces n 1, n 2,, n k respectivamente. Se puede construir un nuevo árbol haciendo que n se constituya en el padre de los nodos n 1, n 2,, n k. En dicho árbol, n es la raíz y A 1, A 2,..., A k son los subarboles (o arboles hijos) de la raíz. Los nodos n 1, n 2,,n k reciben el nombre de hijos del nodo n y el nodo n recibe el nombre de padre de dichos nodos Como ejemplo se puede considerar el índice de un libro. T1 (Tema 1) T2 (Tema 2) T3 (Tema 3) 1.1.-(Pregunta 1 del Tema 1) 1.2.-(Pregunta 2 del Tema 1) 2.1.-(Pregunta 1 del Tema 2) (Pregunta 1 de la pregunta 1 del Tema 2) ( Pregunta 2 de la pregunta 1 del Tema 2) 2.2.-(Pregunta 2 del Tema 2) 2.3.-(Pregunta 3 del Tema 2) Tal índice es el árbol que se muestra en la Figura 2.1. La relación padre-hijo entre dos nodos se representa por una línea descendente que los une. Normalmente, los arboles se dibujan de arriba a abajo, con el padre encima de los hijos. En el ejemplo, la relación de paternidad representa inclusión: el libro está compuesto por los temas 1, 2 y 3.
10 T T1 T2 T Figura 2.1. Ejemplo del índice de un libro. Se llaman hermanos a los arboles hijos del mismo padre. Ejemplo: 2.1, 2.2 y 2.3 son hermanos. Si n 1, n 2,, n k, es una sucesión de nodos de un árbol tal que n i es el padre de n i+1 para i = 1, 2,, K-1, entonces a la sucesión se denomina del nodo n 1 al nodo n k. Ejemplo: T2, 2.1, es un camino. La longitud de un camino es el número de nodos del camino menos 1. Por lo tanto, existen caminos de longitud cero, que son aquellos que van de cualquier nodo a sí mismo. Ejemplo: el camino T2, 2.1, tiene longitud 2. Si existe un camino de un nodo a a otro b, entonces a es un antecesor de b, y b es un descendiente de a. Cada nodo es a la vez un antecesor y un descendiente de sí mismo. En nuestro ejemplo, los antecesores de 2.1 son el mismo, T2 y Libro. Un antecesor o un descendiente de un nodo que no sea el mismo, recibe el nombre de antecesor propio o descendiente propio, respectivamente. En un árbol, la raíz es el único nodo que no tiene antecesores propios. Un nodo sin descendientes propios se denomina hoja o nodo terminal. Los atributos de un árbol son los siguientes: El grado de un nodo es el número de subarboles que tiene. En nuestro ejemplo el grado de T2 es 3. Por lo tanto son nodos terminales u hojas los nodos de grado 0.
11 La altura de un nodo es la longitud del camino más largo de ese nodo a una hoja. El nivel o profundidad de un nodo es la longitud del único camino desde la raíz a ese nodo. Por definición la raíz tiene nivel 0. La profundidad de un árbol se define como el máximo de los niveles de los nodos del árbol Orden de los nodos hijos. Se habla de un árbol no ordenado cuando explícitamente se ignora el orden de los A menudo los hijos de un nodo se ordenan de izquierda a derecha. El orden de izquierda a derecha de los hermanos se puede extender para comparar dos nodos cualesquiera entre los cuales no exista la relación antecesor-descendiente. La regla es que si a y b son hermanos y a esta a la izquierda de b, entonces todos los descendientes de a están a la izquierda de todos los descendientes de b. Dado un nodo n, una regla sencilla para determinar que nodos están a su izquierda y cuales a su derecha, consiste en dibujar el camino de la raíz a n. Todos los nodos que salen a la izquierda de este camino, y todos sus descendientes, están a la izquierda de m. Los nodos, y sus descendientes, que salen a la derecha, están a la derecha de n Recorridos de un árbol Hay varias maneras de recorrer los nodos de un árbol para ser procesados con una cierta operación. Se va a estudiar dos estrategias para recorrer un árbol y procesar sus nodos: Recorrido en profundidad. Recorrido en anchura Recorrido en profundidad Existen tres formas de recorrer un árbol en profundidad: A) Preorden u orden previo. B) Inorden u orden simétrico. C) Postorden u orden posterior. Estas tres formas de ordenar un árbol se definen de forma recursiva como sigue: 1. Si el árbol A es nulo, entonces la lista está vacía, es el listado de los nodos del árbol A en los órdenes preorden, inorden y postorden. 2. Si el árbol A tiene un solo nodo, entonces ese nodo constituye el listado del árbol A en los tres órdenes (preorden, inorden y postorden). 3. Si el árbol A tiene más de un nodo, es decir, tiene como raíz el nodo n y los subárboles A 1, A 2,...,A k entonces:
12 k l q n s t u Figura Ejemplo de recorrido de un árbol en profundidad. A)El listado en preorden de los nodos del árbol A esta formado por la raíz del árbol A, seguida de los nodos del árbol A 1 en preorden, luego por los nodos A 2 en preorden y así sucesivamente hasta los nodos de A k en preorden. A continuación se ve cómo será el recorrido en preorden de la Figura El listado en preorden es: k l n s q t u B) El listado en inorden de los nodos del árbol A esta constituido por los nodos del árbol de A 1 en inorden, seguidos de la raíz n y luego por los nodos de A 2,, A k en inorden. A continuación se ve cómo será el recorrido en inorden de la Figura El listado en inorden es: n l s k t q u Siempre se debe llegar al último nivel y luego se sube hacia arriba. C) El listado en postorden de los nodos del árbol A esta formado por los nodos del árbol A 1 en postorden, luego los nodos de A 2 en postorden y así sucesivamente hasta los nodos de A k en postorden y por último la raíz n. A continuación se ve cómo será el recorrido en postorden de la Figura El listado en postorden en: n s l t u q k Recorrido en anchura Otro posible recorrido de un árbol es un recorrido en anchura, es decir explorando el árbol por niveles, y listando los nodos de izquierda a derecha empezando por el nivel 0, luego el nivel 1, etc. El recorrido en anchura para el árbol de la Figura , daría la secuencia de nodos: n T1 T2 T3 T4 T5.
13 n nivel 0 T1 T2 T3 nivel 1 T4 T5 nivel 2 Figura Ejemplo de recorrido de un árbol en anchura Ventajas y desventajas La principal ventaja de los arboles multirrama consiste en que existen más nodos en un mismo nivel que en los arboles binarios con lo que se consigue que si el árbol es de búsqueda, los accesos a los nodos sean más rápidos. El inconveniente más importante que tienen es la mayor ocupación de memoria, pudiendo ocurrir que en ocasiones la mayoría de los nodos no tengan descendientes o al menos no todos los que podrían tener desaprovechándose por tanto gran cantidad de memoria. Cuando esto ocurre lo mejor es transformar el árbol multicamino en su binario de búsqueda equivalente.
14 3. Diagrama UML GUI + principal,arbol,botones,h,pad : JPanel. + añadir,eliminar,salir,add,clear : JButton. 1 + addhijo, clearnodo : JFrame. + padres,nodos : JComboBox. + area : JtextArea. + hijo, nodo: JTextField. 1 + lh,lp,ln : JLabel. +res,i : int. + nombreh, nombrep, nombren,command, ps[],tab: String. Hoja + name : String. + parent : Leaf. * + children : ArrayList <Leaf>. + c : Container. + tree : Tree. + root : Leaf. + p : ArrayList<Leaf>. + pi : Iterator. + main(string args[]) : void Arbol + root : Leaf. + control : boolean. + textfile : StringBuffer. +firstfile : StringBuffer. 1 + getname( ) : String. + setname(name : String) : void. + getparent( ) : Leaf. + setparent(parent : Leaf) : void. + getchildren( ) : ArrayList<Leaf>. + getchildren2( ) : ArrayList<String>. + setchildren(children : ArrayList<Leaf>):void. + insertchildren(node : Leaf) : void. + rowofchild(node : Leaf) : int. + equals (node : Object) : Boolean. * + containsnode(node : Leaf) : int. + initialize( ) : void. + añadir() : void. + eliminar() : void + creararbol(root : Leaf, command : Boolean) : void. + guardar : void. + salir : void. + actionperformed(actionevent ae) : void. 1 + iscontrol( ) : Boolean. + setcontrol(control : boolean) : void. + gettextfile( ) : StringBuffer. + getfirstfile( ) : StringBuffer. + addnewchild( childname : String, parentname : String, rootnode : Leaf) : Leaf. + removechild(node : String, rootnode : Leaf) : void +printchildren( rootnode : Leaf) : void. + savetreestructuretofile( rootnode : Leaf, filename : String, strbuffer : StringBuffer ) : void. + setlineoffirstfile( node : Leaf) : String. + sendrootnode() : Leaf.
15 Las clases de este programa tienen una relación de asociación, es decir, una clase puede estar formada por objetos de otras clases. A veces, en una relación de asociación se entiende expresamente que se cuenta con una composición total de partes. En este caso existe una relación de agregación y en el diagrama de clases un diamante vacío se utiliza en la parte que corresponde a todos. Un árbol puede tener infinitas hojas. A su vez la interfaz grafica de usuario (GUI) tiene un árbol e infinitas hojas. 4. Orden de complejidad de los algoritmos: Arboles 4.1 Introducción Gran parte de la motivación para el diseño de árboles se debe a lacompatibilidad que presentan con algoritmos eficaces. El análisis de algoritmos nos permite medir la dificultad inherente de un problema y evaluar la eficiencia de un algoritmo. 4.2 Tiempos de Ejecución Una medida que suele ser útil conocer es el tiempo de ejecución de un algoritmo en función de N, lo que se denominara T(N). Esta función se puede medir físicamente (ejecutando el programa, reloj en mano), o calcularse sobre el código contando instrucciones a ejecutar y multiplicando por el tiempo requerido por cada instrucción. Así, un trozo sencillo de programa como: S1; FOR i:= 1 TO N DO S2 END; Requiere: T(N):= t1 + t2*n Siendo t1 el tiempo que lleve ejecutar la serie "S1" de sentencias, y t2 el que lleve la serie "S2". Prácticamente todos los programas reales incluyen alguna sentencia condicional, haciendo que las sentencias efectivamente ejecutadas dependan de los datos concretos que se le presenten. Esto hace que más que un valor T(N) debamos hablar de un rango de valores: Tmin(N) <= T(N) <= Tmax(N) los extremos son habitualmente conocidos como "caso peor" y "caso mejor". Entre ambos se hallará algún "caso promedio" o más frecuente. Cualquier fórmula T(N) incluye referencias al parámetro N y a una serie de constantes "Ti" que dependen de factores externos al algoritmo como pueden ser la calidad del código generado por el compilador y la velocidad de ejecución de instrucciones del ordenador que lo ejecuta. Dado que es fácil cambiar de compilador y que la potencia de los ordenadores crece a un ritmo vertiginoso, se intentan analizar los algoritmos con algún nivel de independencia de estos factores, es decir, se buscan estimaciones generales ampliamente válidas. No se puede medir el tiempo en segundos porque no existe un ordenador estándar de referencia, en su lugar se mide el número de operaciones básicas o elementales.
16 Las operaciones básicas son las que realiza el ordenador en tiempo acotado por una constante, por ejemplo: Operaciones aritméticas básicas Asignaciones de tipos predefinidos Saltos (llamadas a funciones, procedimientos y retorno) Comparaciones lógicas Acceso a estructuras indexadas básicas (vectores y matrices) Es posible realizar el estudio de la complejidad de un algoritmo sólo en base a un conjunto reducido de sentencias, por ejemplo, las que más influyen en el tiempo de ejecución. Para medir el tiempo de ejecución de un algoritmo existen varios métodos. Veamos algunos de ellos: a) Benchmarking La técnica de benchmark considera una colección de entradas típicas representativas de una carga de trabajo para un programa. b) Profiling Consiste en asociar a cada instrucción de un programa un número que representa la fracción del tiempo total tomada para ejecutar esa instrucción particular. Una de las técnicas más conocidas es la Regla 90-10, que afirma que el 90% del tiempo de ejecución se invierte en el 10% del código. c) Análisis Consiste en agrupar las entradas de acuerdo a su tamaño, y estimar el tiempo de ejecución del programa en entradas de ese tamaño, T(n). De este modo, el tiempo de ejecución puede ser definido como una función de la entrada. Se denotara T(n) como el tiempo de ejecución de un algoritmo para una entrada de tamaño n. 4.3 Concepto de Complejidad La complejidad o costo de un algoritmo es una medida de la cantidad de recursos (tiempo, memoria) que el algoritmo necesita. La complejidad de un algoritmo se expresa en función del tamaño del problema. La función de complejidad tiene como variable independiente el tamaño del problema y sirve para medir la complejidad. Mide el tiempo/espacio relativo en función del tamaño del problema. El comportamiento de la función determina la eficiencia. No es única para un algoritmo: depende de los datos. Para un mismo tamaño del problema, las distintas presentaciones iniciales de los datos dan lugar a distintas funciones de complejidad. Es el caso de una ordenación si los datos están todos inicialmente desordenados, parcialmente ordenados o en orden inverso.
17 4.4 Órdenes de Complejidad Se dice que O (f(n)) define un "orden de complejidad". Escogeremos como representante de este orden a la función f(n) más sencilla del mismo. Así tendremos: O (1) orden constante O (log n) orden logarítmico O(n) orden lineal O (n2) orden cuadrático O (na) orden polinomial (a > 2) O (an) orden exponencial (a > 2) O (n!) orden factorial Es más, se puede identificar una jerarquía de órdenes de complejidad que coincide con el orden de la tabla anterior; jerarquía en el sentido de que cada orden de complejidad superior tiene a los inferiores como subconjuntos. Si un algoritmo A se puede demostrar de un cierto orden O1, es cierto que también pertenece a todos los órdenes superiores (la relación de orden cota superior es transitiva); pero en la práctica lo útil es encontrar la "menor cota superior", es decir, el menor orden de complejidad que lo cubra. Antes de realizar un programa conviene elegir un buen algoritmo, donde por bueno entendemos que utilice pocos recursos, siendo usualmente los más importantes el tiempo que lleve ejecutarse y la cantidad de espacio en memoria que requiera. Es engañoso pensar que todos los algoritmos son "más o menos iguales" y confiar en la habilidad como programadores para convertir un mal algoritmo en un producto eficaz. Es asimismo engañoso confiar en la creciente potencia de las máquinas y el abaratamiento de las mismas como remedio de todos los problemas que puedan aparecer. En la Figura 4.4 se muestra un ejemplo de algunas de las funciones más comunes en análisis de algoritmos son: Figura 4.4. Ejemplo grafica análisis algoritmos. La mejor técnica para diferenciar la eficiencia de los algoritmos es el estudio de los órdenes de complejidad. El orden de complejidad se expresa generalmente en términos de la cantidad de datos procesados por el programa, denominada n, que puede ser el tamaño dado o estimado.
18 En el análisis de algoritmos se considera usualmente el caso peor, si bien a veces conviene analizar igualmente el caso mejor y hacer alguna estimación sobre un caso promedio. Para independizarse de factores coyunturales, tales como el lenguaje de programación, la habilidad del codificador, la máquina de soporte, etc. se suele trabajar con un cálculo asintótico que indica cómo se comporta el algoritmo para datos muy grandes y salvo algún coeficiente multiplicativo. Para problemas pequeños es cierto que casi todos los algoritmos son "más o menos iguales", primando otros aspectos como esfuerzo de codificación, legibilidad, etc. Los órdenes de complejidad sólo son importantes para grandes problemas. 4.5 Complejidad en arboles Uno de los muchos motivos por los que se estudian los árboles reside en que, aunque las listas enlazadas ofrecen tiempos de búsqueda de O(n), la mayoría de las implementaciones de árboles admiten tiempos de búsqueda de O (log n). Para entender cómo se calcula el orden de complejidad en un árbol, primero se va exponer un ejemplo con una lista simplemente enlazada. Si se quiere insertar un elemento en ella se puede hacer al principio que sería directo (a esto se le llama O (1)), al final que sería lo peor al tener que recorrer todos los elementos (a esto se le conoce como O(n)) o un caso intermedio, que sería O (log n). Este último es un promedio ya que a veces estará más cerca del principio, otras más cerca del final y otras por en medio. Ejemplo: Si tienes 8 elementos (n=8) lo peor es insertar al final y hay qué recorrer los n elementos, es decir, 8. Lo mejor es 1, y el promedio daría log 8 =3 (el Log es en base 2). Pues en un árbol si se tienen 8 elementos, estos se pueden repartir de una forma uniforme en ramas de forma qué por ejemplo cada una de ellas tenga 3 elementos, de esta forma al insertar un elemento en una rama como mucho se tendrá que recorrer 3 elementos, de aquí sale él O (Log n) ya qué O (Log 8) = 3.
19 5. Caso de estudio 5.1 Titulo Creación de una interfaz grafica para la gestión de un árbol genealógico. 5.2 Introducción Un árbol genealógico es un árbol que presenta la herencia biológica de una persona, comenzando con sus padres y retrocediendo a través de las generaciones, pasando por sus abuelos, bisabuelos, etc. La diferencia entre un árbol genealógico teórico y un árbol genealógico real es que el árbol real puede no estar perfectamente equilibrado, debido a la falta de datos o a la existencia de datos incompletos. En lo que respecta a este caso de estudio, se va a crear una interfaz grafica para la gestión de un árbol genealógico que permitirá al usuario seleccionar un padre y luego ir introduciendo los hijos de cualquiera de los padres existentes en el programa. A su vez también se podrá eliminar cualquier nodo. El programa también permite guardar los datos introducidos en un documento de texto, imprimir el árbol guardado y salir del sistema. 5.3 Diseño inicial El programa está formado por cuatro componentes: la clase árbol, la clase hoja, la clase test y la interfaz grafica de usuario (GUI). En un principio el programa se ejecutaba a través de la clase test (donde se encuentra el método main). Por lo que por consola se mostraba un pequeño menú con cuatro opciones: añadir, eliminar, guardar, imprimir y salir. Si se escribe la opción añadir se pedirá el nombre del hijo que se quiere añadir y el nombre del padre al que se quiere añadir ese nuevo hijo. Si el nombre del padre es igual a null, es que este hijo va a ser un nuevo nodo raíz y si no se irá comparando el nombre del padre introducido por teclado con todos los nombres de los nodos que haya en el documento de texto guardado read.txt y cuando lo encuentre se insertara el nuevo hijo a ese padre. Abajo se muestra el método para que se pueda entender mejor: public Leaf addnewchild(string childname, String parentname, Leaf rootnode){ //se da el número de hijos de ese nodo for(int i=0; i<rootnode.getchildren().size(); i++){ // se recorren todos los hijos de esa hoja y en el nodo //en el que este en ese momento será el padre. Leaf parentnode = rootnode.getchildren().get(i); // se comparan los nombres if(parentnode.getname().equals(parentname)){
20 // si es el nombre que el programa está buscando, //inserta el nodo parentnode.insertchild(new Leaf(childName, parentnode)); //se encuentra un nodo con el mismo nombre que el //usuario ha introducido control = true; //cierro if // en el caso de que el usuario ponga más de un nodo //con el mismo nombre, el programa solo añade el hijo //en el primer nodo. Otra posibilidad es quitar el //"break" y el programa añade el nuevo hijo a todos //los padres con el mismo nombre. break; //si el nodo tiene hijos, el programa llama al método //recursivo if (parentnode.getchildren().size()!= 0){ addnewchild(childname, parentname, parentnode); //cierro for return rootnode; //cierro método addnewchild Si la opción es eliminar el programa pedirá el nombre del nodo a eliminar y se irá comparando con cada uno de los hijos del árbol.si corresponde con uno de los nodos guardados en el documento de texto se eliminara dicho nodo introducido. Abajo se muestra el método para su mejor compresión: //metodo que elimina el nombre de nodo que se le pasa public void removechild(string Node, Leaf rootnode){ //se da el número de hijos de este subárbol for(int i=0; i<rootnode.getchildren().size(); i++){ //se recorre uno a uno los nodos del árbol Leaf parentnode = rootnode.getchildren().get(i); // se comparan los nombres if(parentnode.getname().equals(node)){ // si es el nombre que el programa está buscando, //elimina el nodo rootnode.getchildren().remove(i); // se encuentra un nodo con el mismo nombre que el //usuario ha introducido control = true; break; //llamada al metodo recursivo removechild(node,parentnode); //cierra for
21 //cierra removechild() Si la opción es guardar se almacenara en un documento de texto ese nuevo padre e hijo introducido anteriormente en la opción añadir o si se ha eliminado algún nodo también se modificara el documento de texto read.txt. En la Figura se muestra un ejemplo de lo que almacena el archivo read.txt : Figura Ejemplo archivo read.txt.
22 Si la opción es imprimir se mostrara por consola el documento de texto donde se guardan los datos que se introducen por teclado pero en forma de árbol. El archivo que lo muestra así es el out.txt. //este método visualiza el árbol public void printchildren(leaf rootnode, Boolean command){ String tab = ""; for(int i=0;i<rootnode.getchildren().size(); i++){ tab = ""; //con este bucle se puede ver la cantidad de nivel de //profundidad que hay. for(int j=0; j<rootnode.rowofchild(rootnode); j++){ //el programa añade una nueva tabulación para cada //nivel tab += '\t'; String str = tab + rootnode.getchildren().get(i).getname(); //si command es true actualiza el búfer que luego se //utiliza para imprimir el archivo out.txt if (command){ //el programa añade las líneas al búfer que escribe //el árbol textfile.append(str + " " + System.getProperty("line.separator")); //si command es false el programa actualiza el búfer que //más tarde muestra el árbol else{ System.out.println(str); //si el nodo tiene hijos, el programa llama de nuevo al //metodo recursivo if (rootnode.getchildren().get(i).getchildren().size()!= 0){ else{ //cierra for //cierra metodo printchildren() printchildren(rootnode.getchildren().get(i),command); // el programa obtiene la línea para añadir en el //búfer del archivo readtext.txt firstfile.append(setlineoffirstfile(rootnode. getchildren().get(i))+ System.getProperty("line.separator"));
23 En la siguiente Figura se muestra un ejemplo de lo que almacena el archivo out.txt : Figura Ejemplo archivo out.txt. La última opción es salir que cerrara el programa y se esperara a que el usuario lo vuelva a ejecutar.
24 5.4 Implementación de la interfaz grafica Para diseñar la interfaz grafica que visualice de la forma más clara y sencilla el árbol genealógico se crea una ventana principal donde hay un área de texto donde se mostrara el árbol y unos botones que serán añadir, eliminar y salir. En la Figura se muestra como quedaría dicha interfaz. Figura Ejemplo de la interfaz grafica Si se pulsa el botón añadir se abrirá una nueva ventana donde se podrá introducir el nombre del hijo y se mostrara un desplegable con todos los nodos almacenados en el archivo read.txt para poder seleccionar el padre al que se quiere añadir ese hijo. Figura Ejemplo de la ventana que se muestra al pulsar el botón añadir.
25 Cuando se pulse el botón Add estos datos serán guardados en un documento de texto y a su vez el árbol se imprimirá en el área de texto de la ventana principal en forma de árbol. Figura Ejemplo de la ventana que se muestra al añadir un hijo. Si el botón seleccionado es eliminar se abrirá una nueva ventana donde se volverá a mostrar un desplegable con todos los nodos almacenados en el archivo read.txt. Entonces se elegirá el nodo a eliminar. Figura Ejemplo de la ventana que se muestra al pulsar el botón eliminar.
26 Cuando se pulse el botón Clear el nodo seleccionado se eliminara, se guardara dicho cambio y el árbol será mostrado en la ventana principal de nuevo. Figura Ejemplo de la ventana que se muestra al borrar un hijo. Al pulsar el botón de salir se abrirá una nueva ventana con un pequeño menú donde se le preguntara al usuario si está seguro de querer salir del programa. Si se pulsa que Si el programa se cerrara y si es que No el programa permanecerá abierto. Figura Ejemplo de la ventana que se muestra al pulsar el botón salir.
27 6. Conclusiones Desde el comienzo de este proyecto se han intentado trazar los objetivos exigidos a fin de que la ejecución sea clara y viable. Este proyecto puede ser útil en múltiples áreas ya que los arboles son estructuras compuestas por nodos, utilizadas para representar datos de forma jerárquica entre los elementos que la conforman y que son utilizados para la solución de una gran variedad de problemas, ya que pueden implementarse fácilmente en un ordenador. Además el uso de arboles permite a los usuarios mejorar o modificar el programa de acuerdo a las necesidades que se tengan haciéndolo ya sea, con una interfaz mucho más dinámica a la ya existente o implementándole mejoras que ninguna otra aplicación antes tuviera de acuerdo a sus propiedades. Por lo tanto, la realización de este proyecto ha sido interesante y me ha enriquecido como programadora. 7. Anexos El programa se divide en cuatro clases java, que son: Leaf.java, Tree.java, Test.java y Teclado.java. Como resultado de la ejecución del programa se crean dos archivos, out.txt y readtext.txt. Para una mejor comprensión del código y los archivos resultantes se comentaran cada uno de ellos. La clase Leaf.java crea cada una de las hojas que más tarde formaran el árbol. import java.util.arraylist; import java.util.iterator; public class Leaf { private String name; private Leaf parent; //array de hijos public ArrayList<Leaf> children=null; //constructor por defecto //un hijo tiene un nombre y un padre public Leaf(String name, Leaf parent){ this.name = name; this.parent = parent; children = new ArrayList<Leaf>();
28 //se da el nombre public String getname() { return name; //se cambia el nombre public void setname(string name) { this.name = name; //se da el padre public Leaf getparent() { return parent; //se cambia el nombre del padre public void setparent(leaf parent) { this.parent = parent; //se da la lista de los nombres de los hijos public ArrayList<String> getchildren2() { //se crea una nueva lista con los nombres de los hijos ArrayList<String> aux= new ArrayList<String>(); if(!name.equals("rootnode"))aux.add((string)name); if(children==null){ return aux; else{ //se crea un iterador para poder ir recorriendo todos los //elementos del array Iterator pi = children.iterator(); //mientras que ese nodo tenga hijos se pasa al siguiente while(pi.hasnext()){ // se recorren los hijos que tenga ArrayList<String> aux2=((leaf)pi.next()).getchildren2(); //se vuelve a recorrer esa lista Iterator pi2 = aux2.iterator(); while(pi2.hasnext()){ aux.add((string)pi2.next()); return aux; //se da la lista de hijos public ArrayList<Leaf> getchildren() { return children; public void setchildren(arraylist<leaf> children) { this.children = children; //se inserta un hijo en el nodo que se le pasa public void insertchild(leaf node) { // si este hijo no contiene el nodo que se le está pasando se le //añade en la siguiente línea if (!this.children.contains(node)){ this.children.add(node);
29 //se recorre por filas hijo a hijo public int rowofchild(leaf node){ int row = 0; while (node.name!= "RootNode"){ row +=1; node = node.parent; return row; //se da la cantidad de hijos que tiene un nodo public int ContainsNode(Leaf node){ for(int i=0; i<this.children.size(); i++){ //se compara si el nombre de ese hijo es igual al nombre //del nodo que te pasa if(this.children.get(i).getname().equals(node.getname())){ return i; return -1; //cierra clase Leaf La siguiente clase es Tree.java, es la aplicación que permite la creación del árbol usando la clase Leaf.java. import java.io.bufferedreader; import java.io.bufferedwriter; import java.io.file; import java.io.filenotfoundexception; import java.io.filereader; import java.io.filewriter; import java.io.ioexception; import java.util.arraylist; import java.util.collections; public class Tree { // se controla si el usuario usa un padre que ya existe private boolean control; // se escribe la estructura árbol en el archivo out.txt private StringBuffer textfile = new StringBuffer(); // se escribe la estructura árbol en el archivo readtext.txt private StringBuffer firstfile = new StringBuffer(); //constructor por defecto public Tree(){ public boolean iscontrol() { return control; public void setcontrol(boolean control) { this.control = control; //se da el archivo out.txt public StringBuffer gettextfile() { return textfile;
30 //se da el archivo read.txt public StringBuffer getfirstfile() { return firstfile; public Leaf addnewchild(string childname, String parentname, Leaf rootnode){ //se da el número de hijos de ese nodo for(int i=0; i<rootnode.getchildren().size(); i++){ //se recorren todo los hijos de esa hoja y en la posición //en la que este en ese momento será el padre Leaf parentnode = rootnode.getchildren().get(i); //se comparan los nombres if(parentnode.getname().equals(parentname)){ // si es el nombre que el programa está buscando, //inserta el nodo parentnode.insertchild(new Leaf(childName, parentnode)); // se encuentra un nodo con el mismo nombre que el //usuario ha introducido control = true; // en el caso de que el usuario ponga más de un nodo //con el mismo nombre,el programa solo añade el hijo //en el primer nodo. Otra posibilidad es quitar el //"break" y el programa añade el nuevo hijo a todos //los padres con el mismo nombre. break; //si el nodo tiene hijos, el programa llama al método //recursivo if (parentnode.getchildren().size()!= 0){ addnewchild(childname, parentname, parentnode); return rootnode; // método que elimina el nombre de nodo que se le pasa public void removechild(string Node, Leaf rootnode){ //se da el número de hijos de este subárbol for(int i=0; i<rootnode.getchildren().size(); i++){ //se recorre uno a uno los nodos del árbol Leaf parentnode = rootnode.getchildren().get(i); // se comparan los nombres if(parentnode.getname().equals(node)){ // si es el nombre que el programa está buscando, //elimina el nodo rootnode.getchildren().remove(i); // se encuentra un nodo con el mismo nombre que el //usuario ha introducido control = true;
31 break; //llamada al método recursivo removechild(node,parentnode); //cierra for //cierra removechild() //este método visualiza el árbol public void printchildren(leaf rootnode, Boolean command){ String tab = ""; for(int i=0;i<rootnode.getchildren().size(); i++){ tab = ""; //con este bucle se puede ver la cantidad de nivel de //profundidad que hay. for(int j=0; j<rootnode.rowofchild(rootnode); j++){ //el programa añade una nueva tabulación para cada //nivel tab += '\t'; String str = tab + rootnode.getchildren().get(i).getname(); //si command es true actualiza el búfer que luego se //utiliza para imprimir el archivo out.txt if (command){ //el programa añade las líneas al búfer que escribe //el árbol textfile.append(str + " " + System.getProperty("line.separator")); //si command es false el programa actualiza el búfer que //más tarde muestra el árbol else{ System.out.println(str); //si el nodo tiene hijos, el programa llama de nuevo al //metodo recursivo if (rootnode.getchildren().get(i).getchildren().size()!=0){ printchildren(rootnode.getchildren().get(i), command); else{ //cierra for //cierra metodo printchildren() // el programa obtiene la línea para añadir en el //búfer del archivo readtext.txt firstfile.append(setlineoffirstfile(rootnode. getchildren().get(i)) + System.getProperty("line.separator"));
32 // método para ir guardando en el archivo de texto el árbol public void savetreestructuretofile(leaf rootnode, String filename, StringBuffer strbuffer){ try{ //se crea el archivo FileWriter fstream = new FileWriter(filename); BufferedWriter out = new BufferedWriter(fstream); out.write(strbuffer.tostring()); out.close(); catch (Exception e){ System.err.println("Error: " + e.getmessage()); //se obtiene la línea que se añade en el archivo readtext.txt con los //predecesores del nodo public String setlineoffirstfile(leaf node){ String line = ""; //se crea un objeto ArrayList ArrayList<String> linelist = new ArrayList<String>(); //se continua mientras el bucle no obtenga todos los predecesores while (node.getname()!= "RootNode"){ linelist.add(node.getname()); node = node.getparent(); //el bucle obtiene los nombres de los nodos desde el último hasta //el primero. Es necesario invertirlo. Collections.reverse(lineList); for(int i=0; i< linelist.size();i++){ line += linelist.get(i) + ","; //se coge la línea sin la última coma return line.substring(0, line.length()-1); //se devuelve la hoja raíz public Leaf sendrootnode(){ File file = new File("readText.txt"); BufferedReader reader = null; //se crea una nueva hoja, que será la raíz Leaf root = new Leaf("RootNode", null); //se hace una copia para ejecutar el árbol Leaf broot = root; try { reader = new BufferedReader(new FileReader(file)); String line = null; // se repite hasta que todas las líneas son leídas while ((line = reader.readline())!= null) { String []fields = line.split(","); for(int i =0;i<fields.length;i++){ //se crea una nueva hoja Leaf leaf = new Leaf(fields[i], broot); //containsindex = obtiene el índice de la //hoja hijo
33 int containsindex = broot.containsnode(leaf); //se comprueba si el padre contiene esta hoja if (containsindex!= -1){ //si el padre contiene este hijo, a //continuación se busca la fila de ese //hijo, y temporalmente hace que sea la //nueva raíz broot = broot.getchildren().get(containsindex); else{ //cierra for //si el padre no contiene esta hoja, //entonces se añade esta hoja como hijo //de este padre broot.insertchild(leaf); //esta hoja es el nuevo padre broot = leaf; //para la nueva línea del archivo, se comienza desde //el principio a hacer el mismo proceso broot = root; //cierra while catch (FileNotFoundException e) { System.out.println("El archivo no ha sido encontrado"); catch (IOException e) { System.out.println("Ha ocurrido un error"); finally { try { if (reader!= null) { reader.close(); catch (IOException e) { e.printstacktrace(); //cierra primer try return root; //cierra método //cierra clase La clase Test.java es donde está el método main. public class test { public static void main (String args[]) { String child = null; String parent = null; String node = null;
34 //las opciones pueden se añadir,guardar,imprimir y salir String command = null; System.out.println("Bienvenido\n\n"); Tree tree = new Tree(); Leaf root = tree.sendrootnode(); do{ System.out.println("Introduce el comando(añadir,eliminar,imprimir,guardar,salir): "); command = Teclado.readString(); if(command.equals("añadir")){ System.out.println( "Inserta el nombre del hijo: " ); child = Teclado.readString(); System.out.println( "Inserta el nombre del padre: " ); parent = Teclado.readString(); //si el archivo readtext.txt esta vacio if (parent.equals("null")){ //se inserta nuevo hijo root.insertchild(new Leaf(child, root)); tree.setcontrol(true); //si el archivo readtext.txt no está vacío el //programa ha de buscar al padre e insertar al hijo else{ root = tree.addnewchild(child, parent,root); if (tree.iscontrol()){ System.out.println("El nodo ha sido añadido satisfactoriamente..."); tree.setcontrol(false); else{ System.out.println("El padre no ha sido encontrado!!!"); else if (command.equals("imprimir")){ // se va a la primera línea tree.gettextfile().setlength(0); tree.getfirstfile().setlength(0); tree.printchildren(root, false); else if(command.equals("guardar")){ tree.gettextfile().setlength(0); tree.getfirstfile().setlength(0); tree.printchildren(root, true); //se escribe el árbol estructura en el archivo //out.txt tree.savetreestructuretofile(root, "out.txt", tree.gettextfile()); //se escribe el árbol estructura en el archivo //readtext.txt tree.savetreestructuretofile(root, "readtext.txt", tree.getfirstfile()); else if(command.equals("eliminar")){ System.out.println( "Inserta el nombre del nodo a borrar: " );
35 //cierra do //cierra clase test node = Teclado.readString(); tree.removechild(node,root); if (tree.iscontrol()){ System.out.println("El nodo ha sido eliminado..."); tree.setcontrol(false); else{ System.out.println("El nodo no ha sido encontrado!!!"); while((!command.equals("salir")) && (!command.equals("" +""))); System.out.println("El programa ha sido cerrado. Vuelva a ejecutarlo"); La clase GUI.java es la clase donde se crea la interfaz grafica. import java.awt.*; import javax.swing.*; import javax.swing.event.*; import java.awt.event.*; import java.util.*; import java.io.ioexception; import javax.swing.tree.*; public class GUI extends JFrame implements ActionListener{ private JPanel principal,arbol,botones,h,pad,n; private JButton añadir,eliminar,guardar,imprimir,salir; private JFrame addhijo,clearnodo; private JButton add,clear; private JComboBox padres, nodos;//para crear un desplegable private JTextArea area; private JTextField hijo,nodo; private JLabel lh,lp,ln; int res; private String nombreh; private String nombrep; private String nombren; private String command = null; private Tree tree ; private Leaf root; //constructor por defecto public GUI(){ super ("Árbol Genealógico "); initialize();
36 public static void main (String args[]){ GUI frame = new GUI(); frame.setsize(700,500); frame.setvisible(true); frame.setdefaultcloseoperation(jframe.exit_on_close); //cierra main private void initialize(){ //se obtiene el contenedor asociado a la ventana Container c = getcontentpane(); c.setlayout(new FlowLayout()); //se crean los paneles principal = new JPanel(); arbol = new JPanel(); //se crea el bordeado del área de texto Box cuadro = Box.createHorizontalBox(); area = new JTextArea(25,50); area.seteditable(false); cuadro.add(new JScrollPane(area)); arbol.add(cuadro); //se crean los botones y se añaden a los escuchadores botones = new JPanel(new GridLayout(4,1)); añadir = new JButton("Añadir"); añadir.addactionlistener(this); //guardar = new JButton("Guardar"); //guardar.addactionlistener(this); eliminar = new JButton("Eliminar"); eliminar.addactionlistener(this); //imprimir = new JButton("Imprimir"); //imprimir.addactionlistener(this); salir = new JButton("Salir"); salir.addactionlistener(this); botones.add(añadir); botones.add(eliminar); //botones.add(imprimir); //botones.add(guardar); botones.add(salir); principal.add(arbol); principal.add(botones); c.add(principal); tree = new Tree(); root = tree.sendrootnode(); //cierra método inicializa //método añadir nodo public void añadir(){
37 addhijo = new JFrame("Añadir Hijo"); addhijo.setsize(350,150); addhijo.setdefaultcloseoperation(addhijo.exit_on_close); addhijo.setvisible(true); addhijo.setvisible(true); addhijo.setlayout(new GridLayout(3,1)); h = new JPanel(); lh = new JLabel ("Nombre Hijo"); hijo = new JTextField(20); h.add(lh); h.add(hijo); //Obtener los padres existentes //se coge un array con todos los nodos que cuelgan de la raíz ArrayList<String> p = root.getchildren2(); //se crea un iterador para poder ir recorriendo todos los //elementos del array Iterator pi = p.iterator(); String []ps = new String[p.size()+1]; ps[0] = "Root"; int i = 1; //se pasa al siguiente while(pi.hasnext()){ ps[i] = ((String)pi.next()); i++; pad = new JPanel(); padres = new JComboBox(ps); lp = new JLabel("Nombre Padre"); pad.add(lp); pad.add(padres); addhijo.add(h); addhijo.add(pad); add = new JButton("Añadir"); add.addactionlistener(this); addhijo.add(add); //método eliminar nodo public void eliminar(){ clearnodo = new JFrame("Borrar nodo"); clearnodo.setsize(350,150); clearnodo.setdefaultcloseoperation(clearnodo.exit_on_close); clearnodo.setvisible(true); clearnodo.setvisible(true); clearnodo.setlayout(new GridLayout(2,1)); n = new JPanel(); //se obtienen los padres existentes //se coge un array con todos los nodos que cuelgan de la raíz ArrayList<String> p = root.getchildren2();
38 //se crea un iterador para poder ir recorriendo todos los //elementos del array Iterator pi = p.iterator(); String []ps = new String[p.size()+1]; ps[0] = "Root"; int i = 1; //se pasa al siguiente while(pi.hasnext()){ ps[i] = ((String)pi.next()); i++; nodos = new JComboBox(ps); ln = new JLabel ("Nombre Nodo"); n.add(ln); n.add(nodos); clearnodo.add(n); clear = new JButton("Clear"); clear.addactionlistener(this); clearnodo.add(clear); //método imprimir en la clase Tree.java public void creararbol(leaf root, Boolean command){ String tab = ""; for(int i=0;i<root.getchildren().size(); i++){ tab = ""; //con este bucle se puede ver la cantidad de nivel //de profundidad que hay. for(int j=0; j<root.rowofchild(root); j++){ //el programa añade una nueva tabulación para //cada nivel tab += '\t'; String str = tab + root.getchildren().get(i).getname(); //si comando es true actualiza el búfer que luego //se utiliza para imprimir el archivo out.txt if (command){ //el programa añade las líneas al búfer que //escribe el árbol tree.gettextfile().append(str + " " + System.getProperty("line.separator")); //si el comando es false el programa actualiza el //búfer que más tarde muestra el árbol else{ //para que te muestre el árbol sin que se //pueda modificar area.append(str+"\n");
39 //si el nodo tiene hijos, el programa llama de nuevo //al método recursivo if (root.getchildren().get(i).getchildren().size()!= 0){ creararbol(root.getchildren(). get(i),command); else{ //el programa obtiene la línea para añadir en el //búfer del archivo readtext.txt //for //cierra método creararbol() tree.getfirstfile().append(tree.setlineoffirstfile (root.getchildren().get(i)) + System.getProperty("line.separator")); public void guardar(){ System.out.println("guardando"); tree.gettextfile().setlength(0); tree.getfirstfile().setlength(0); tree.printchildren(root, true); //se escribe el árbol estructura en el archivo out.txt tree.savetreestructuretofile(root, "out.txt", tree.gettextfile()); //se escribe el árbol estructura en el archivo readtext.txt tree.savetreestructuretofile(root, "readtext.txt", tree.getfirstfile()); public void salir(){ res = JOptionPane.showConfirmDialog(null, " Desea salir?", "Salir", JOptionPane.YES_NO_OPTION); if (res==joptionpane.yes_option){ System.exit(0); public void actionperformed (ActionEvent ae){ if (ae.getsource()== añadir){ añadir(); //este boton es el "OK" de la segunda ventana if (ae.getsource()== add){ nombreh = hijo.gettext(); nombrep = padres.getselecteditem().tostring(); if(nombrep == "Root"){ root.insertchild(new Leaf(nombreH, root)); else{ root =tree.addnewchild(nombreh,nombrep,root);
40 guardar(); creararbol(root,false); //cuando se pulsa el boton "OK" se guarda el hijo en //el padre seleccionado y se borra lo que //haya en la ventana para poder introducir un nuevo //hijo addhijo.dispose(); JOptionPane.showMessageDialog(addHijo,"Elemento insertado correctamente"); if (ae.getsource()== eliminar){ eliminar(); //este boton es el "OK" de la segunda ventana if (ae.getsource()== clear){ nombren = nodos.getselecteditem().tostring(); tree.removechild(nombren, root); guardar(); creararbol(root,false); //cuando se pulsa el boton "OK" se elimina el nodo //introducido y se borra lo que haya en la ventana para //poder introducir un nuevo nodo a eliminar clearnodo.dispose(); JOptionPane.showMessageDialog(clearNodo,"Elemento eliminado correctamente"); /* if (ae.getsource() == guardar){ */ guardar();//este boton se quitara de la interfaz /* if (ae.getsource() == imprimir){ */ //area.settext("arbol Genealogico\n"); creararbol(root,false); if (ae.getsource() == salir){ salir();//este boton se quitara de la interfaz //cierra metodo actionperformed //cierra clase
41 8. Bibliografía y referencias 1. Introducción a la programación con orientación a objetos. Camelia Muñoz Caro, Alfonso Niño Ramos y otros. Prentice Hall. 2. La Biblia de Java. Schildt, Herbert. Anaya 3. Java. Cómo programar. Dietel Harvey M., Deitel Paul J. Pearson Addison-Wesley. 4. Estructuras de datos en Java. John Lewis y Joseph Chase. Pearson Addison-Wesley. 5. Estructura de datos y algoritmos en Java. Adam Drozdek. Thomson. 6. An Introduction to Data Structures and Algorithms with Java, Rowe, Glen; Prentice Hall. 7. Estructura de datos, especificación, diseño e implementación. Xavier Franch Gutiérrez. Ediciones UPC. 8. Fundamentos de estructuras de datos, Soluciones en Ada, Java y C++. Zenón José Hernández Figueroa y otros. Thompson 9. Estructura de datos, algoritmos y programación orientada a objetos. Gregory L. Heileman. McGraw-Hill.
DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
ARBOLES ESTRUCTURAS DE DATOS 2006 DEFINICION Un árbol (tree) es un conjunto finito de nodos. Es una estructura jerárquica aplicable sobre una colección de elementos u objetos llamados nodos; uno de los
En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.
Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa
Árboles. Cursos Propedéuticos 2015. Dr. René Cumplido M. en C. Luis Rodríguez Flores
Árboles Cursos Propedéuticos 2015 Dr. René Cumplido M. en C. Luis Rodríguez Flores Contenido de la sección Introducción Árbol genérico Definición y representación Árboles binarios Definición, implementación,
Solución al Examen de Prácticas de Programación (Ingeniería Informática)
Solución al Examen de Prácticas de Programación (Ingeniería Informática) Junio 2006 Parte I. Cuestiones (3 puntos=50% nota del examen) 1) Se desea crear un conjunto de clases para representar en un programa
CAPITULO 4. Requerimientos, Análisis y Diseño. El presente capítulo explica los pasos que se realizaron antes de implementar
CAPITULO 4 Requerimientos, Análisis y Diseño El presente capítulo explica los pasos que se realizaron antes de implementar el sistema. Para esto, primero se explicarán los requerimientos que fueron solicitados
Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO
Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO 1.- Objetivos del laboratorio Diseño de clases en C++ Comprensión y uso del TAD Árbol Binario de Búsqueda
Tema 10- Representación Jerárquica: Tema 10- Representación Jerárquica: Árboles Binarios
Tema 10- Representación Jerárquica: Árboles Binarios Tema 10- Representación Jerárquica: Árboles Binarios Germán Moltó Escuela Técnica Superior de Ingeniería Informática Universidad Politécnica de Valencia
Formularios. Formularios Diapositiva 1
Formularios Crear un formulario utilizando el Asistente para formularios Modificación en vista Diseño Adición de Controles a un Formulario Adición de un Subformulario a un formulario Formularios Diapositiva
Modulo 1 El lenguaje Java
Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto
Ampliación de Estructuras de Datos
Ampliación de Estructuras de Datos Amalia Duch Barcelona, marzo de 2007 Índice 1. Diccionarios implementados con árboles binarios de búsqueda 1 2. TAD Cola de Prioridad 4 3. Heapsort 8 1. Diccionarios
Sesión No. 4. Contextualización INFORMÁTICA 1. Nombre: Procesador de Texto
INFORMÁTICA INFORMÁTICA 1 Sesión No. 4 Nombre: Procesador de Texto Contextualización La semana anterior revisamos los comandos que ofrece Word para el formato del texto, la configuración de la página,
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO. Introducción FACULTAD DE INGENIERÍA. Ordenación
Introducción Uno de los procedimientos más comunes y útiles en el procesamiento de datos, es la clasificación u ordenación de los mismos. Se considera ordenar al proceso de reorganizar un conjunto dado
ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES
ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES Introducción al tema a. Formar grupos de 4 personas b. Tomar una hoja en blanco y una lapicera o lápiz c. En la hoja en blanco diseña un
Operación Microsoft Access 97
Trabajar con Controles Características de los controles Un control es un objeto gráfico, como por ejemplo un cuadro de texto, un botón de comando o un rectángulo que se coloca en un formulario o informe
8. Sentencia return y métodos
92 A. García-Beltrán y J.M. Arranz 8. Sentencia return y métodos Objetivos: a) Describir el funcionamiento de la sentencia return b) Interpretar el resultado de una sentencia return en el código fuente
2_trabajar con calc I
Al igual que en las Tablas vistas en el procesador de texto, la interseccción de una columna y una fila se denomina Celda. Dentro de una celda, podemos encontrar diferentes tipos de datos: textos, números,
INDICE. 1. Introducción... 4. 2. El panel Entities view... 5. 3. El panel grafico... 6. 4. Barra de botones... 6. 4.1. Botones de Behavior...
MANUAL DE USUARIO INDICE 1. Introducción... 4 2. El panel Entities view... 5 3. El panel grafico... 6 4. Barra de botones... 6 4.1. Botones de Behavior... 7 4.2. Botones de In-agents... 8 4.3. Botones
RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA
UNED Centro Asociado de Cádiz RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA 1. OBJETOS Cualquier elemento del programa es un objeto. Un programa es un conjunto de objetos que se comunican entre sí
PRÁCTICA No. 13 ÁRBOL BINARIO DE BÚSQUEDA
INSTITUTO POLITÉCNICO NACIONAL SECRETARIA ACADÉMICA DIRECCIÓN DE EDUCACIÓN SUPERIOR ESIME CULHUACAN NOMBRE ALUMNO: FECHA DIA MES AÑO INGENIERÍA EN COMPUTACIÓN ASIGNATURA 1. Objetivo Apellido paterno ESTRUCTURAS
Árboles AVL. Laboratorio de Programación II
Árboles AVL Laboratorio de Programación II Definición Un árbol AVL es un árbol binario de búsqueda que cumple con la condición de que la diferencia entre las alturas de los subárboles de cada uno de sus
Programación Orientada a Objetos con Java
Programación Orientada a Objetos con Java M.C. Jorge Eduardo Ibarra Esquer [email protected] Sobrecarga de métodos Java permite la definición de dos o más métodos que tengan el mismo nombre, dentro de la
Árbol binario. Elaborado por Ricardo Cárdenas cruz Jeremías Martínez Guadarrama Que es un árbol Introducción
Árbol binario Elaborado por Ricardo Cárdenas cruz Jeremías Martínez Guadarrama Que es un árbol Introducción Un Árbol Binario es un conjunto finito de Elementos, de nombre Nodos de forma que: El Árbol Binario
... Formas alternativas de escribir un texto. Columnas. anfora CAPÍTULO 4
CAPÍTULO 4. Formas alternativas de escribir un texto........ Columnas Para fijar columnas se posiciona el Punto de Inserción donde se desee que comiencen las columnas, o bien se selecciona el texto que
COMPROBACIONES BÁSICAS PARA EL USO DE FIRMA EN EL RTC
TITULO: COMPROBACIONES BÁSICAS PARA EL USO DE FIRMA EN EL RTC RESUMEN: La idea de este documento es mostrar una serie de acciones y ayudas básicas para intentar determinar y solucionar problemas en la
árbol como un conjunto de nodos y líneas
ÁRBOLES CAPÍTULO 6 ÁRBOLES Desde el punto de vista conceptual, un árbol es un objeto que comienza con una raíz (root) y se extiende en varias ramificaciones o líneas (edges), cada una de las cuales puede
La ventana de Microsoft Excel
Actividad N 1 Conceptos básicos de Planilla de Cálculo La ventana del Microsoft Excel y sus partes. Movimiento del cursor. Tipos de datos. Metodología de trabajo con planillas. La ventana de Microsoft
NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS
1 NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS Árboles Binarios y Árboles Binarios Ordenados 2 Contenido Árboles binarios Iteradores Árboles binarios ordenados 3 Árboles binarios Algunas definiciones para
1. Creación del repositorio
FACULTADE DE INFORMÁTICA Departamento de Computación Tecnología de la Programación 2008-2009 Ingeniería Informática Práctica 1: Subversion Introducción El objetivo de esta práctica es aprender a manejar
Notas de Clase. Prof. Juan Andrés Colmenares, M.Sc. Instituto de Cálculo Aplicado Facultad de Ingeniería Universidad del Zulia. 21 de febrero de 2004
Árboles Notas de Clase Prof. Juan Andrés Colmenares, M.Sc. Instituto de Cálculo Aplicado Facultad de Ingeniería Universidad del Zulia 21 de febrero de 2004 Índice 1. Definición 1 2. Términos Básicos 2
COMO CREAR UNA PÁGINA WEB 2-INTRODUCCIÓN A DREAWEAVER
2011 2012 COMO CREAR UNA PÁGINA WEB 2-INTRODUCCIÓN A DREAWEAVER WWW.FAUBELL.COM [email protected] Hasta ahora hemos visto una pequeña introducción a la creación de las páginas web. No te preocupes por
PANEL DE CONTROL (Zona de Administración) MANUAL DE USO Por conexanet. Revisión 1.1 Fecha 2006-08
PANEL DE CONTROL (Zona de Administración) MANUAL DE USO Por conexanet Revisión 1.1 Fecha 2006-08 Índice 1. Acceder 2. Menú 3. Gestión Básica 3.1 Añadir 3.2 Editar 3.3 Eliminar 3.4 Eliminación de registros
La pestaña Inicio contiene las operaciones más comunes sobre copiar, cortar y pegar, además de las operaciones de Fuente, Párrafo, Estilo y Edición.
Microsoft Word Microsoft Word es actualmente (2009) el procesador de textos líder en el mundo gracias a sus 500 millones de usuarios y sus 25 años de edad. Pero hoy en día, otras soluciones basadas en
MANUAL DE AYUDA MODULO TALLAS Y COLORES
MANUAL DE AYUDA MODULO TALLAS Y COLORES Fecha última revisión: Enero 2010 Índice TALLAS Y COLORES... 3 1. Introducción... 3 CONFIGURACIÓN PARÁMETROS TC (Tallas y Colores)... 3 2. Módulos Visibles... 3
Guía de Aprendizaje No. 1
MICROSOFT WORD Fundamentos básicos, ejecutar Word, su ventana y sus barras de herramientas Objetivos de la Guía de Aprendizaje No. 1 Obtener fundamentos básicos sobre Procesador de Texto Microsoft Word
Las propiedades de la clase en java es el equivalente a las variables globales en lenguajes estructurados como el C.
EJERCICIO GUIADO. JAVA: VARIABLES GLOBALES Variables Globales / Propiedades de la Clase Las propiedades de la clase en java es el equivalente a las variables globales en lenguajes estructurados como el
GESTIÓN DOCUMENTAL PARA EL SISTEMA DE CALIDAD
GESTIÓN DOCUMENTAL PARA EL SISTEMA DE CALIDAD Manual de usuario 1 - ÍNDICE 1 - ÍNDICE... 2 2 - INTRODUCCIÓN... 3 3 - SELECCIÓN CARPETA TRABAJO... 4 3.1 CÓMO CAMBIAR DE EMPRESA O DE CARPETA DE TRABAJO?...
Programa diseñado y creado por 2014 - Art-Tronic Promotora Audiovisual, S.L.
Manual de Usuario Programa diseñado y creado por Contenido 1. Acceso al programa... 3 2. Opciones del programa... 3 3. Inicio... 4 4. Empresa... 4 4.2. Impuestos... 5 4.3. Series de facturación... 5 4.4.
Plataforma e-ducativa Aragonesa. Manual de Administración. Bitácora
Plataforma e-ducativa Aragonesa Manual de Administración Bitácora ÍNDICE Acceso a la administración de la Bitácora...3 Interfaz Gráfica...3 Publicaciones...4 Cómo Agregar una Publicación...4 Cómo Modificar
Tema 2. Espacios Vectoriales. 2.1. Introducción
Tema 2 Espacios Vectoriales 2.1. Introducción Estamos habituados en diferentes cursos a trabajar con el concepto de vector. Concretamente sabemos que un vector es un segmento orientado caracterizado por
1.4.1.2. Resumen... 1.4.2. ÁREA DE FACTURACIÓN::INFORMES::Pedidos...27 1.4.2.1. Detalle... 1.4.2.2. Resumen... 1.4.3. ÁREA DE
MANUAL DE USUARIO DE ABANQ 1 Índice de contenido 1 ÁREA DE FACTURACIÓN......4 1.1 ÁREA DE FACTURACIÓN::PRINCIPAL...4 1.1.1. ÁREA DE FACTURACIÓN::PRINCIPAL::EMPRESA...4 1.1.1.1. ÁREA DE FACTURACIÓN::PRINCIPAL::EMPRESA::General...4
Pruebas de unidad con JUnit
Pruebas de unidad con JUnit Cuando se implementa software, resulta recomendable comprobar que el código que hemos escrito funciona correctamente. Para ello, implementamos pruebas que verifican que nuestro
WINDOWS 2008 5: TERMINAL SERVER
WINDOWS 2008 5: TERMINAL SERVER 1.- INTRODUCCION: Terminal Server proporciona una interfaz de usuario gráfica de Windows a equipos remotos a través de conexiones en una red local o a través de Internet.
Capítulo 12: Indexación y asociación
Capítulo 12: Indexación y asociación Conceptos básicos Índices ordenados Archivos de índice de árbol B+ Archivos de índice de árbol B Asociación estática Asociación dinámica Comparación entre indexación
GENERACIÓN DE TRANSFERENCIAS
GENERACIÓN DE TRANSFERENCIAS 1 INFORMACIÓN BÁSICA La aplicación de generación de ficheros de transferencias permite generar fácilmente órdenes para que la Caja efectúe transferencias, creando una base
Profesorado de Informática Ciencias de la Computación INET- DFPD Matemática I - Matemática Discreta usando el computador Ing. Prof.
Árboles Profesorado de Informática Ciencias de la Computación INET- DFPD Matemática I - Matemática Discreta usando el computador Ing. Prof. Paula Echenique Una de las estructuras de datos más importantes
Manual CMS Mobincube
Manual CMS Mobincube CMS Mobincube Qué es? El CMS (Sistema de Gestión de Contenidos) es un completo website que permite la creación y actualización de contenido remoto. De esta forma, una vez creada una
LAS CONSULTAS ACCESS 2007. Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE
LAS CONSULTAS ACCESS 2007 Manual de Referencia para usuarios Salomón Ccance CCANCE WEBSITE LAS CONSULTAS En esta unidad veremos cómo crear consultas y manejarlas para la edición de registros de tablas
Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.
Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero. Uso de Ficheros Todas las estructuras de datos vistas hasta ahora utilizan la
Registro (record): es la unidad básica de acceso y manipulación de la base de datos.
UNIDAD II 1. Modelos de Bases de Datos. Modelo de Red. Representan las entidades en forma de nodos de un grafo y las asociaciones o interrelaciones entre estas, mediante los arcos que unen a dichos nodos.
Bases de datos en Excel
Universidad Complutense de Madrid CURSOS DE FORMACIÓN EN INFORMÁTICA Bases de datos en Excel Hojas de cálculo Tema 5 Bases de datos en Excel Hasta ahora hemos usado Excel básicamente para realizar cálculos
GUÍA DE LABORATORIO 5 ARREGLOS DE UNA DIMENSIÓN
GUÍA DE LABORATORIO 5 ARREGLOS DE UNA DIMENSIÓN INTRODUCCION Un arreglo es una colección de variables del mismo tipo, referidos por un nombre común. En Java, los arreglos tienen una o más dimensiones,
BASES Y DIMENSIÓN. Propiedades de las bases. Ejemplos de bases.
BASES Y DIMENSIÓN Definición: Base. Se llama base de un espacio (o subespacio) vectorial a un sistema generador de dicho espacio o subespacio, que sea a la vez linealmente independiente. β Propiedades
Capítulo 6. ÁRBOLES.
67 Capítulo 6. ÁRBOLES. 6.1 Árboles binarios. Un árbol binario es un conjunto finito de elementos, el cual está vacío o dividido en tres subconjuntos separados: El primer subconjunto contiene un elemento
Uso de Visual C++ Pre-Practica No. 3
Pre-Practica No. 3 Uso de Visual C++ Microsoft Visual C++ 2010 es una versión de Visual Studio específica para el lenguaje de programación C++. Es un entorno de desarrollo muy completo y profesional. Por
Gobierno del Estado de México
Gobierno del Estado de México Escuela Preparatoria Oficial No. 82 José Revueltas Hay que alcanzar la exaltación verdadera, para lograrlo, hay que ser serenos, sin prisas, estudiar, trabajar y disciplinarse
Ejemplos de conversión de reales a enteros
Ejemplos de conversión de reales a enteros Con el siguiente programa se pueden apreciar las diferencias entre las cuatro funciones para convertir de reales a enteros: program convertir_real_a_entero print
Manual de operación Tausend Monitor
Manual de operación Tausend Monitor Luego de haber realizado satisfactoriamente el proceso de instalación, al iniciar el programa le aparecerá la siguiente ventana: El usuario principal y con el primero
Traslado de Copias y Presentación de Escritos. Manual de Usuario V.3.1
Traslado de Copias y Presentación de Escritos Manual de Usuario V.3.1 Página: 2 45 INDICE INTRODUCCIÓN... 3 1 ACCESO A LA APLICACIÓN... 3 2 PROCESO DE FIRMA... 4 3 TRASLADOS PENDIENTES DE ACEPTAR POR EL
Introducción a la programación orientada a objetos
Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases 3. El tipo Struct 4. Diferencias entre Class y Struct 5. Pilares de la Programación
CONCEPTOS BASICOS. Febrero 2003 Página - 1/10
CONCEPTOS BASICOS Febrero 2003 Página - 1/10 EL ESCRITORIO DE WINDOWS Se conoce como escritorio la zona habitual de trabajo con windows, cuando iniciamos windows entramos directamente dentro del escritorio,
Práctica 4: Java Remote Method Invocation (RMI)
Práctica 4: Java Remote Method Invocation (RMI) Aplicaciones Telemáticas II Introducción Hasta el momento hemos visto aplicaciones remotas donde un cliente utiliza un objeto remoto que ha sido publicado
Presentaciones. Con el estudio de esta Unidad pretendemos alcanzar los siguientes objetivos:
UNIDAD 8 Presentaciones Reunión. (ITE. Banco de imágenes) as presentaciones son documentos formados por una sucesión de páginas, llamadas diapositivas, que transmiten información estructurada de manera
Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)
Unidad I Sistemas numéricos 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal) Los computadores manipulan y almacenan los datos usando interruptores electrónicos que están ENCENDIDOS o APAGADOS.
MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO
MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO Fecha última revisión: Junio 2011 INDICE DE CONTENIDOS HERRAMIENTA DE APROVISIONAMIENTO... 3 1. QUÉ ES LA HERRAMIENTA DE APROVISIONAMIENTO... 3 HERRAMIENTA
Creación y administración de grupos de dominio
Creación y administración de grupos de dominio Contenido Descripción general 1 a los grupos de Windows 2000 2 Tipos y ámbitos de los grupos 5 Grupos integrados y predefinidos en un dominio 7 Estrategia
ICARO MANUAL DE LA EMPRESA
ICARO MANUAL DE LA EMPRESA 1. ENTRANDO EN ICARO Para acceder al Programa ICARO tendremos que entrar en http://icaro.ual.es Figura 1 A continuación os aparecerá la página de Inicio del aplicativo ICARO.
GedicoPDA: software de preventa
GedicoPDA: software de preventa GedicoPDA es un sistema integrado para la toma de pedidos de preventa y gestión de cobros diseñado para trabajar con ruteros de clientes. La aplicación PDA está perfectamente
TEMA 2 WINDOWS XP Lección 4 BLOC DE NOTAS
TEMA 2 WINDOWS XP Lección 4 BLOC DE NOTAS 1) EL PEQUEÑO EDITOR El Bloc de notas de Windows XP es un básico editor de texto con el que podemos escribir anotaciones, de hasta 1024 caracteres por línea y
CASO PRÁCTICO DISTRIBUCIÓN DE COSTES
CASO PRÁCTICO DISTRIBUCIÓN DE COSTES Nuestra empresa tiene centros de distribución en tres ciudades europeas: Zaragoza, Milán y Burdeos. Hemos solicitado a los responsables de cada uno de los centros que
UAM MANUAL DE EMPRESA. Universidad Autónoma de Madrid
MANUAL DE EMPRESA Modo de entrar en ÍCARO Para comenzar a subir una oferta de empleo, el acceso es a través del siguiente enlace: http://icaro.uam.es A continuación, aparecerá la página de inicio de la
Capítulo 9. Archivos de sintaxis
Capítulo 9 Archivos de sintaxis El SPSS permite generar y editar archivos de texto con sintaxis SPSS, es decir, archivos de texto con instrucciones de programación en un lenguaje propio del SPSS. Esta
Examen escrito de Programación 1
Examen escrito de Programación 1 Escuela de Ingeniería y Arquitectura Departamento de Informática e Ingeniería de Sistemas 2 de septiembre de 2015 Se debe disponer sobre la mesa en lugar visible un documento
Subespacios vectoriales en R n
Subespacios vectoriales en R n Víctor Domínguez Octubre 2011 1. Introducción Con estas notas resumimos los conceptos fundamentales del tema 3 que, en pocas palabras, se puede resumir en técnicas de manejo
Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 5: Report Builder
Ministerio de Educación Base de datos en la Enseñanza. Open Office Módulo 5: Report Builder Instituto de Tecnologías Educativas 2011 Informes con Oracle Report Builder En su configuración original, OpenOffice
ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES
ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES Características ARBOLES - CONCEPTOS Cada elemento del árbol se relaciona con cero o más elementos a quienes llama hijos. Si el árbol no
MANUAL DE FACTURACIÓN TOUCH SCREEN
MANUAL DE FACTURACIÓN TOUCH SCREEN Tabla de Contenido Contenido Pág. CAPITULO 1... 3 CARACTERÍSTICAS Y BENEFICIOS... 3 CAPITULO 2... 4 ENTRADAS Y SALIDAS DEL MODULO... 4 Visión general... 4 Contenido del
Diseño de formularios
Universidad Complutense de Madrid CURSOS DE FORMACIÓN EN INFORMÁTICA Diseño de formularios Introducción a las bases de datos Tema 5 El aspecto de los formularios Se puede modificar a voluntad el aspecto
3.1. Guardar un libro de trabajo
Vamos a ver las operaciones referentes a archivos como abrir, nuevo, guardar, guardar como y cerrar para poder manejarlas sin problemas a la hora de trabajar con libros de trabajo de Excel. Básicamente
Sistema de Gestión Portuaria Sistema de Gestión Portuaria Uso General del Sistema
Sistema de Gestión Portuaria Uso General del Sistema Uso General del Sistema Página 1 de 21 Contenido Contenido... 2 1.Ingreso al Sistema... 3 2.Uso del Menú... 6 3.Visualizar Novedades del Sistema...
Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.
CICLO: 01/2010 Universidad Don Bosco Materia: Lenguaje de Programación III Contenido: 1-Lectura de Datos de entrada. 2-Introduccion a JOPTIONPANE. 3-Estructuras de Control. ->LECTURA DE DATOS DE ENTRADA
Estructuras de datos: Proyecto 2
Estructuras de datos: Proyecto 2 28 de mayo de 2013 Instrucciones Enviar las soluciones por email a los ayudantes, con copia a la profesora. Plazo de entrega: 16 de junio (durante todo el día). Se debe
CÓMO CREAR NUESTRO CATÁLOGO
CÓMO CREAR NUESTRO CATÁLOGO Mediante la aplicación (http://www.prensasoft.com/programas/conline) podemos crear nuestros propios catálogos. Para crear un catálogo necesitamos: - Varios productos que mostrar,
Para crear una lista como la anterior, primero escribe la información, y después selecciona el texto y aplícale el formato de viñetas.
Módulo 3 Herramientas de Cómputo Listas, tabulaciones, columnas y cuadros de texto Listas En muchas ocasiones es necesario que enumeres diferentes elementos en tus documentos. Word no sólo reconoce números
13.1. Tablas dinámicas de Excel
13.1. Tablas dinámicas de Excel Una tabla dinámica consiste en el resumen de un conjunto de datos, atendiendo a varios criterios de agrupación, representado como una tabla de doble entrada que nos facilita
Creación de Funciones de Conducción
Creación de Funciones de Conducción Requerimientos Para el desarrollo de esta actividad se requiere que: Contemos con un robot BoeBot armado con placa Arduino. Repetición En estos momentos habremos notado
Operación de Microsoft Word
Generalidades y conceptos Combinar correspondencia Word, a través de la herramienta combinar correspondencia, permite combinar un documento el que puede ser una carta con el texto que se pretende hacer
Mantenimiento Limpieza
Mantenimiento Limpieza El programa nos permite decidir qué tipo de limpieza queremos hacer. Si queremos una limpieza diaria, tipo Hotel, en el que se realizan todos los servicios en la habitación cada
Tema 3. Medidas de tendencia central. 3.1. Introducción. Contenido
Tema 3 Medidas de tendencia central Contenido 31 Introducción 1 32 Media aritmética 2 33 Media ponderada 3 34 Media geométrica 4 35 Mediana 5 351 Cálculo de la mediana para datos agrupados 5 36 Moda 6
MANUAL DE USUARIO CMS- PLONE www.trabajo.gob.hn
MANUAL DE USUARIO CMS- PLONE www.trabajo.gob.hn Tegucigalpa M. D. C., Junio de 2009 Que es un CMS Un sistema de administración de contenido (CMS por sus siglas en ingles) es un programa para organizar
SINAC - Sistema de Información Nacional de Agua de Consumo MENU PRINCIPAL. Copyright Ministerio de Sanidad y Consumo
SINAC - Sistema de Información Nacional de Agua de Consumo MENU PRINCIPAL Copyright Ministerio de Sanidad y Consumo 1. MENU PRINCIPAL DE SINAC... 3 1.1. MÓDULO ABRIR... 5 1.2. MÓDULO DE ENTRADAS... 6 1.2.1.
A continuación se describen cuáles son los elementos principales de las tablas, cómo crear una y cómo modificarla.
4. TABLAS A continuación se describen cuáles son los elementos principales de las tablas, cómo crear una y cómo modificarla. 4.1. Principales Elementos Al momento de generar y diseñar una tabla es importante
Estructuras de Datos y Algoritmos. Árboles de Expresión
Estructuras de Datos y Algoritmos Árboles de Expresión Año 2014 Introducción Los avances tecnológicos producen día a día una gran cantidad de información que debe ser almacenada y procesada en forma eficiente.
19 4.1.1.0 4 04/05/2009
Soluciones Informáticas Descripción: Como utilizar la Agenda de Visitas Objetivos: Al finalizar este tutorial el usuario será capaz de utilizar la Agenda de Visitas con sus diferentes opciones: asignar
MÓDULO 2: TRATAMIENTO DE DATOS CON HOJA DE CÁLCULO. Tema 1: Gestión de listas de datos y tablas dinámicas. Leire Aldaz, Begoña Eguía y Leire Urcola
MÓDULO 2: TRATAMIENTO DE DATOS CON HOJA DE CÁLCULO Tema 1: Gestión de listas de datos y tablas dinámicas Leire Aldaz, Begoña Eguía y Leire Urcola Índice del tema - Introducción a las listas de datos -
Introducción a la plataforma Moodle Aníbal de la Torre 2006. Plataforma Moodle. Accediendo a los contenidos
Plataforma Moodle Accediendo a los contenidos Formatos ----------------------------------------------------------------------- 2 Glosarios -----------------------------------------------------------------------
ESTRUCTURA DE DATOS: ARREGLOS
ESTRUCTURA DE DATOS: ARREGLOS 1. Introduccion 2. Arreglos - Concepto - Caracteristicas 3. Arreglos Unidimensionales 4. Arreglos Bidimensionales 5. Ventajas del uso de arreglos 6. Ejemplo 1. Introducción
Introducción a los Tipos Abstractos de Datos
Página 1 de 8 Introducción a los Tipos Abstractos de Datos Introducción: Concepto de abstracción Abstracción funcional y abstracción de datos Construcción de tipos abstractos de datos Especificación de
1.1. Introducción y conceptos básicos
Tema 1 Variables estadísticas Contenido 1.1. Introducción y conceptos básicos.................. 1 1.2. Tipos de variables estadísticas................... 2 1.3. Distribuciones de frecuencias....................
GENERACIÓN DE CÓDIGO
GENERACIÓN DE CÓDIGO INTRODUCCION La generación de código es la fase más compleja de un compilador, puesto que no sólo depende de las características del lenguaje fuente sino también de contar con información
ARREGLOS DEFINICION GENERAL DE ARREGLO
ARREGLOS DEFINICION GENERAL DE ARREGLO Conjunto de cantidades o valores homogéneos, que por su naturaleza se comportan de idéntica forma y deben de ser tratados en forma similar. Se les debe de dar un
