E

electromedico

Usuario (Paraguay)

Primer post: 26 mar 2010Último post: 18 may 2011
5
Posts
50
Puntos totales
0
Comentarios
O
odbc conexion
TaringaporAnónimo4/30/2010

UNIVERSIDAD TECNOLOGICA INTERCONTINENTAL Ingeniería en Sistemas Informáticos PROFESOR: Lic. Charles Cabrera BASE DE DATOS I Integrantes: CURSO: 2º AÑO TURNO: NOCHE SAN LORENZO – PARAGUAY AÑO 2010 Introducción Es importante para un programador conocer sobre los distintos métodos de acceder a una base de datos es ahí la importancia de conocer sobre las opciones y las herramientas con la que se cuentan siendo la tecnología de conexión una de las mas útil para su aplicación en la informática .El OBDC no es una base de datos. El OBDC (Object Data Base Conector) son drivers que sirven para hacer conexiones con bases de datos sin la necesidad de instalar el software de la base de datos solo utilizando el archivo de base de datos (ejm. mdb, dbf, sql, etc). Hay OBDCs para Access, Sql, DBase, etc.. Con estos driver se pueden hacer altas, bajas, consultas, etc de una base de datos una vez instalado su respectivo driver ¿Qué es ODBC? Open DataBase Conectivity (ODBC) es un desarrollo de Microsoft que se ha convertido en estándar, para el acceso a través de él a gran cantidad de tipos de datos. Básicamente, por tanto, cualquier aplicación simple que emplee ODBC puede acceder a las Bases de datos soportadas por este estándar. El funcionamiento es: la aplicación sólo necesita comunicarse con un paquete de archivos (ODBC), e instantáneamente puede trabajar con cualquier tipo de datos soportados por este paquete. Hay dos posibles accesos a la Base de datos (DIRECTO e INDIRECTO) el que denomino DIRECTO consiste en que normalmente, una compañía diseña una aplicación que accederá a datos. Esta aplicación se desarrolla hacia un tipo de datos, y por tanto sólo se implementa el acceso para ese tipo de datos. Si se requiere acceso a otro DBMS, es necesario por tanto, implementar un nuevo controlador o driver de acceso. Este sistema hace que el acceso sea directo a la Base de datos, pero tiene el inconveniente de que hay que desarrollar el enlace para cada DBMS que se quiera soportar. Otro posible acceso es el INDIRECTO, es decir, si el DBMS posibilita que con ODBC puedan ser accedidos los datos, es decir funciona con lo que se denomina ODBC data source, (o fuente de datos ODBC) la aplicación accede a través del paquete de archivos ODBC "indirectamente", y si añadimos que ODBC es soportado por los DBMS más comunes, con una misma aplicación y con un mismo paquete de drivers, podremos acceder a todas las DBMS sin necesidad de hacer un desarrollo para cada tipo. Que se debe tener en cuenta 1.A cuantos bits esta trabajando el equipo donde se quiere instalar. 2.Bajo que plataforma se esta trabajando (S.O). 3.Espacio suficiente (55M). 4.A cuantos bits trabaja la herramienta que se quiere comunicar con la base de datos. 5.La versión de la base de datos Oracle a la cual se quiere conectar. 6.La versión SQL que se esta utilizando Ventajas del uso del acceso "indirecto" a través del ODBC: Quizás, la mayor ventaja es que el acceso a datos a través del ODBC permite el poder gestionar un amplio rango de datos con una sola interface. Desde que los más populares DBMS ofrecen drivers ODBC, muchas son las aplicaciones que lo incluyen como drivers de acceso. Otra ventaja es que al poderse variar la fuente de datos, el cambio de una DBMS a otra es simplista. Por ejemplo, si se diseña un informe usando Oracle Data source, y más tarde, la empresa decide cambiar a Microsoft SQL Server, simplemente con cambiar el ODBC data source usado por el informe, se accede a la nueva DBMS. El único requerimiento es que la nueva fuente de datos ha de tener la misma estructura de tablas y campos que la fuente de datos original. Además, el SQL que se envía al ODBC puede ser revisado y corregido antes de su envío, y por tanto se controla exactamente los datos que se quieren recuperar de la fuente. Desventajas del ODBC: La principal desventaja son las capas a través de las cuales tiene que pasar la consulta, esto hace que el tiempo de respuesta hasta que se obtienen los datos se incremente. El proceso es que la petición ha de "traducirse" a ODBC, para que éste entienda la consulta. ODBC determina que fuente de datos contiene los datos que se piden y transmite la petición a la siguiente capa que es la fuente de datos ODBC (ODBC data source). La fuente de datos analiza la petición y "traduce" de nuevo la consulta a un formato que pueda ser "comprendido" por la DBMS. Este complejo proceso puede verse alterado por cualquier fallo en cualquiera de sus fases  y por tanto la consulta no tendría éxito.Cabe añadir que, las fuentes de datos ODBC deben estar configuradas correctamente en el ODBC.INI y en el ODBCINST.INI antes de poder ser usada. Si intentas crear un informe en un sistema y tratas de abrirlo con otro sistema, probablemente no empleen el mismo ODBC data source, y por tanto no se establecerá la conexión. Además hay que asegurarse que el SQL usado en el ODBC ha de estar basado en los estándares establecidos por el American National Standards Institute (ANSI) para el lenguaje SQL. Aplicación detallada: ODBC       Ahora vamos a verlo gráficamente. Soy usuario de una aplicación de PHP que usa bases de datos externas para almacenar información, esta aplicación trabaja directamente con MySQL, pero mi intención es tener una conexión con una base de datos de Microsoft Access, porque es más fácil; PHP no trabaja directamente con Access, pero puede entenderse con él usando ODBC de por medio. Necesito crear un origen de datos en ODBC para que PHP sepa a qué base de datos me refiero cuando le solicite información.        Primero vamos a buscar a ODBC, que está en el Panel de Control.       Bueno, y ahora, el Data Source Administrator del Open DataBase Conectivity, u ODBC. Lo que sigue es crear una fuente u origen de datos, pero antes unas explicaciones:      Vas a notar que las primeras tres pestañas se refieren a User DSN, System DSN y File DSN. Perdón, pero tengo la versión en inglés, voy a traducir un poco:      User DSN, nombre del origen de datos para el usuario. A veces, una máquina es utilizada por más de un usuario, los orígenes de datos declarados aquí son exclusivos del usuario.      System DSN, nombre del origen de datos para el sistema. Todos los usuarios de la máquina tienen acceso a estos orígenes de datos.      User DSN, nombre del origen de datos en archivo. Se crea un archivo con la extensión DSN, que sirve como origen de datos y puede ser distribuido a otros usuarios. Este origen es el que usa Excel por omisión cuando hace consultas, cuidado con eso.      Está otra pestaña importante que es ODBC Drivers u Controladores ODBC. Aquí se ven todos los controladores disponibles en la máquina. De está forma puedes consultar si dispones del controlador que necesitas y si es la versión conveniente. Regularmente los controladores de bases de datos vienen con un programa SETUP que los instala y quedan dados de alta en esta lista.      Las otras pestañas merecen artículos aparte pues sirven más a los administradores y desarrolladores de sistemas. Para el fin de crear un origen de datos, con lo que hemos visto tenemos. Lo siguiente:      Vamos a seleccionar la pestaña System DSN, nombre de origen de datos del sistema y presionamos el botón Add&, agregar. Luego señalamos el controlador o driver del tipo de base de datos que queremos accesar: Microsoft Access Driver (o controlador, en la versión en español) y presionamos Finalizar; pero fíjate que todavía no acabamos.       Lo que tenemos que hacer ahora es darle al nuevo origen de datos un nombre peculiar y distintivo, como estamos creando un origen de datos para una base de datos que se llama MyTown.mdb pues le llamo MiPueblo y le damos una descripción (que en realidad no es necesaria). Eso es todo, ahora solamente se debe cerrar el administrador de ODBC presionado el botón Aceptar. Tenemos un origen de datos nuevo que le será útil a aplicaciones que de otra forma no podrían leer una base de datos Access El controlador de ODBC de Microsoft Access se puede instalar, si es que no lo tienes, desde el CD de Office o de Access sí lo tienes como versión independiente. Explicare facilmente como acceder via ODBC a MySQL para acceder con un cliente a la Base de Datos, en este caso Access, y favorecer la introducción de datos o manipulación de los elementos de la Base de Datos. Actualización(12-12-2004): Como solucionar el problema de: Can't connect to MySQL server on 192.168.0.2 Como solucionar el problema de: Host 192.168.0.2 is not allowed to connect to this MySQL server Pagina1/1 Hay un articulo complementario de como Acceder via ODBC a nuestro PostgreSQL Para empezar nos iremos a su pagina principal de MyODBC. Desde aqui, nos bajamos la ultima versión de MyODBC myodbc- para Windows, Primero de todo tendremos que tener instalado correctamente MySQL con alguna Base d Datos activa, y alguna tabla para empezar a probar el acceso a las tablas por ODBC. Para configurar el ODBC para MySQL tenemos que hacer unos sencillos pasos en el cliente de Windows para configurar el Driver de MySQL. Utilidades 1.1 Hacer Consultas Desde la base de datos a excel Para hacer una consulta desde excel a la base de datos se debe utilizar Microsoft Query, creando allí la consulta, en Microsoft Query cuando se desea hacer una consulta se determina que DNS se quiere realizar y ya seleccionada la fuente de datos, se podrán elegir las tablas de las cuales se desea obtener informacion: y realizar las relaciones que se estimen convenientes que Ms Query crea el SQL para la consulta: Cuando ya se tiene creada la consulta, entonces se puede invocar desde Excel así: y al seleccionar que consulta se traerá, excel se encargara de guardar los datos en la hoja electrónica: 1.2 Hacer tablas dinamicas basadas en consultas a la base de datos Para crear tablas dinámicas basadas en consultas deben seguirse los siguientes pasos : Utilizar el Wizard para tablas dinámicas eligiendo Fuente Externa en el paso 1 después se elige la consulta (anteriormente creada) que servirá de base para la tabla dinámica, inmediatamente se abre Ms Query y se retornan los datos a Excel ( Archivo -- Devolver datos ) y se puede seguir con la creación normal de una tabla dinámica : Configuracion del Cliente Windows Instalamos MyODBC en la plataforma Windows que necesitemos Desde el panel de control en la parte de configuración de ODBC vamos la pestaña Use DNS le daremos a ADD. Desde aqui seleccionamos el Driver de MySQL. Aparecera la pantalla de configuración del Driver de MySQL en la que debemos poner una serie de datos para que podamos entrar en el servidor donde tenemos nuestro MySQL. Windows DNS Name: Ponemos el nombre con el que identificar en Windows la Base de Datos MySQL que vamos a acceder. (example: everyoneMySQL) MySQL Host (Name or IP): Aqui le indicamos la IP del servidor o su nombre. (example: 192.168.0.1) MySQL Database Name: El Nombre de la Base de datos que vamos a acceder. (example: MyBD) User: El usuario con privilegios para acceder a la Base de Datos. (example: root) Password: El password para acceder de ese usuario Port (if not 3306): Es el puerto por donde se conecta a la Base de datos, por defecto usara el 3306 Configuracion del Servidor Linux Para poder acceder al servidor Linux y acceder a MySQl no basta con lo anterior, sino que tenemos que dar privilegios a los usuarios para que puedan acceder a las Base de Datos y Tablas que contiene MySQL Para hacer esto necesitaremos acceder a la consola del servidor y acceder a MySQL Para empezar accederemos como root a la Tabla mysql, donde se dan todos los privilegios de acceso a todos los usuarios shell> mysql --user=root mysql Ahora indicamos que desde la IP 192.168.0.2 el usuario: XXXX, con el password: XXXX, va a poder acceder a la Base de datos MySQL mysql> INSERT INTO user (Host,User,Password) VALUES('192.168.0.2','XXXX',PASSWORD('XXXX')); Ahora indicamos que desde la IP 192.168.0.2 el usuario: XXXX, puede acceder a la tabla: mytabla con los privilegios de: Seleccionar, Insertar, Modificar, Borrar, Crear, y Borrar mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES ('192.168.0.2','mytabla',': XXXX ','Y','Y','Y','Y','Y','Y'); Por ultimo le indicamos que empiece a aplicar estos privilegios en este momento.Para salir del modo consola de Mysql basta poner: mysql> q Otras posibilidades para acceder mediante ODBC con DBTools Existe otro programa muy bueno para acceder a MySQL, y que se parece al administrador de Bases de Datos de SQLSERVER, muy sencillo de usar, se llama DBTools, funciona con MySQL, pero pronto podras usarlo con PosgreSQL, puedes bajarte la ultima versión: setup.exe Para acceder a Mysql es practicamente igual que antes: Server Type: Indicas que Base de Datos emplear, ahora solo funciona con MySQL, preo pronto ira con PostgreSql Server Name: Nombre con el que identificarlo Hostname: La direccion o el Hostname del servidor de MySQL Port Number: Es el puerto por donde se conecta a la Base de datos, por defecto usara el 3306 User ID: El usuario con privilegios para acceder a la Base de Datos. (example: root) Password: El password para acceder de ese usuario Espero que os sea util, y que os guste. Esto es solo una introducción, pero podeis dar privilegios como mas os guste con muchas variantes, es solo cuestion de jugar un poco Actualización Como solucionar el problema de: Can't connect to MySQL server on 192.168.0.2 Este problema es bastante comun por lo que se ha visto, y se soluciona editando /etc/mysql/my.cnf y comentando la linea "skip-networking" #skip-networking Ahora tenes que reiniciar MySql /etc/init.d/mysql stop /etc/init.d/mysql start Y con esto solucionas este problema Como solucionar el problema de: Host 192.168.0.2 is not allowed to connect to this MySQL server Este problema es debido a los permisos de sobre la BD Primero entramos en la consola de MySQL mysql -u root -p y luego damos los permisos de esta forma: GRANT ALL PRIVILEGES ON basededatos.* TO [email protected] identified by 'contraseña'; Y con esto solucionamos este problema Conclusión En este artículo dedicado a la conectividad ODBC, se han introducido los conceptos básicos de dicho sistema. Asimismo hemos aprendido a instalar y configurar los drivers ODBC y las librerías ODBC , Ayudando a agilizar la labor de un programador. Siendo esta conexión una opción muy interesante ya que no cuenta con la necesidad de instalar el software de la base de datos Bibliografia: http://www.mysql.com/documentation/mysql/bychapter/manual_Privilege_system.html#Adding_users http://www.iserver.com/support/virtual/mysql/odbc/ http://www.youtube.com/watch?v=JrQdhB2P1C0

0
0
A
arbol,definición,informática
TaringaporAnónimo3/26/2010

Índice Fundamentación Pág. 3 Introducción Pág. 4 Árbol General Concepto Pág. 5 Terminología y Representación Pág. 6 Árbol Binario Concepto Pág. 8 Terminología Pág. 9 Árbol Binario Completo Pág. 11 Conversión de árbol General a Binario Pág. 12 Recorrido en Árboles Binarios Pág. 13 Conclusión Pág. 15 Anexo Pág. 16 Bibliografía Pág. 17 Planteamiento ¿Qué son los Arboles en la Informática? Fundamentación Este trabajo esta realizado con el fin de demostrar la importancia de los árboles en la Informática y como son utilizadas en la misma, también se pretende demostrar a través de la teoría las formas de manipularlas con ejemplos sencillos de números y caracteres. El fin principal es que a la gente a quienes va dirigido el trabajo pueda llegar a comprender lo que es un árbol en si; ya que será muy útil su manejo a lo largo del año universitario, ya que son muy empleados a nivel de programación de distintas formas. Introducción En el siguiente trabajo se hablara acerca de las estructuras no lineales en específico de los Árboles, que se diferencia de las estructuras lineales en la forma de manejo de los datos, las estructuras lineales como su nombre lo indica se lo caracteriza por la linealidad tal así como los arrays que cada elemento iba ordenado secuencialmente uno tras otra en índices continuas en la cual a cada elemento correspondía otro siguiente. En este caso en las estructuras no lineales cada elemento puede tener cualquier siguiente elemento, estas estructuras también son denominadas multienlazadas. Estaremos también mencionando los tipos de árboles empleados en la informática y las operaciones que se pueden realizar sobre las mismas y los recorridos que pueden llegar a tener tal así como el recorrido en: PRE Orden In Orden Post Orden Y les estaremos explicando de que manera hacerlo ya que cada uno de ellos conlleva un orden especifico y una manera distinta dependiendo del tipo de árbol que se tenga. Esperamos que este trabajo el sea útil a los que va dirigido y a los que lo lean. ÁRBOL El árbol es una estructura de datos fundamental en la informática, muy utilizada en todos sus campos, por que se adapta a la representación natural de informaciones homogéneas organizadas y de una gran comodidad y rapidez de manipulación. Otra definición de árbol es como tipo de grafo cíclico, conexo y no dirigido. Las estructuras tipo árbol se usan principalmente para representar datos con una relación jerárquica entre sus elementos, como son árboles genealógicos, tablas, etc. La definición de un árbol implica una estructura recursiva. Esto es, la definición del árbol se refiere a otros árboles. Un árbol con ningún nodo es un árbol nulo; no tiene raíz. Una estructura vacía o un elemento o clave de información (nodo) mas un numero finito de estructuras tipo árbol, disjuntos, llamados subárboles. Si dicho numero de estructuras es inferior o igual a dos, se tiene un árbol binario. Es por tanto, una estructura no secuencial. NODO Un nodo es un punto de intersección o unión de varios elementos que confluyen en el mismo lugar.  Árboles Generales Un árbol general (a veces es llamado árbol) se define como un conjunto, finito no vació T de elementos, llamados nodos, tales que: T contiene un elemento distinguido R, llamado raíz de T. Los restantes elementos de T forman una colección ordenada de cero o mas árboles disjuntos T1, T2,.., Tm.. La Figura 1.1 muestra un árbol en el que hemos rotulado cada nodo con una letra dentro de un círculo. Esta es una notación típica para dibujar árboles. Los tres subárboles del raíz A son B, C y D respectivamente, B es la raíz de un árbol con un subárbol E. Este subárbol no tiene subárbol conectado. El árbol C tiene 2 subárboles, F y G. FIGURA 1.1 TERMINOLOGÍA Y REPRESENTACIÓN DE UN ÁRBOL GENERAL La representación y terminología de los arboles se realiza con las típicas notaciones de las relaciones familiares en los árboles genealógicos: padre, hijo, hermano, ascendente, descendiente, etc. RAIZ: Todos loa árboles que no esta vacíos tienen un único nodo raíz. Todos los demás elementos o nodos derivan o descienden de el. El nodo Raíz no tiene Padre es decir no es hijo de ningún elemento PADRE: X es padre de Y sí y solo sí el nodo X apunta a Y. También se dice que X es antecesor de Y. HIJO: X es hijo de Y, sí y solo sí el nodo X es apuntado por Y. También se dice que X es descendiente directo de Y. HERMANO: Dos nodos serán hermanos si son descendientes directos de un mismo nodo. HOJA. Se le llama hoja o Terminal a aquellos nodos que no tienen ramificaciones (hijos). NODO. Son los Vértices o elementos del Árbol. NODO INTERIOR. Es un nodo que no es raíz ni Terminal. GRADO. Es el número de descendientes directos de un determinado nodo. GRADO DEL ARBOL Es el máximo grado de todos los nodos del árbol. NIVEL. Es el número de arcos que deben ser recorridos para llegar a un determinado nodo. Por definición la raíz tiene nivel 1. ALTURA. Es el máximo número de niveles de todos los nodos del árbol. Equivale al nivel más alto de los nodos más 1. PESO. Es el número de nodos terminales del árbol LONGITUD DE CAMINO. Es el número de arcos que deben ser recorridos para llegar desde la raíz al nodo X. Por definición la raíz tiene longitud de camino 1, y sus descendientes directos longitud de camino 2 y así sucesivamente. FIGURA 1.2 EJEMPLO DE LA TERMINOLOGIA DE UN ARBOL FIGURA 1.2 RAIZ : A NIVEL 0 : A NIVEL 1: B, C, D NIVEL 2 : E, F, G, H, I, J NIVEL 3: K, L ALTURA : 4 PESO : 7 HOJAS : E, F, K, L, H, I, J OTARA MANERA DE REPRESENTAR EL MISMO ARBOL ES LA SIGUIENTE Árboles Binarios Existe un tipo de árbol denominado árbol binario que puede ser implementado fácilmente en una computadora. Un árbol binario es un conjunto finito de cero o más nodos tales que: Existe un nodo denominados raíz del árbol Cada nodo puede tener 0, 1 o 2 subárboles, conocidos como subárbol izquierdo y subárbol derecho Ejemplos de Árboles Binarios (a)Expresión de árbol a+b/c; (b) y (c) Dos árboles diferentes con valores enteros Terminología de los árboles binarios Dos árboles se dicen que son similares si tienen la misma estructura, y son equivalentes si son similares y contienen la misma información. Un árbol binario esta equilibrado si las alturas de los dos subárboles de cada nodo del árbol se diferencias en una unidad como máximo. altura (subárbol izquierdo) – altura(subárbol derecho)<=1 ÁRBOLES BINARIOS SIMILARES El procesamiento de árboles equilibrados es más sencillo que los árboles no equilibrados. En la figura 1.4 se muestran 2 árboles binarios de diferentes alturas y en la figura 1.5 árboles equilibrados y sin equilibrar FIGURA 1.4 FIGURA 1.5 ÁRBOLES BINARIOS DE DIFERENTES ALTURTAS (a) ARBOL EQUILIBRADO T : Altura = 3 (b) ARBOL NO EQUILIBRADO T1: Árbol Vacío T2: Altura = 6 ÁRBOLES BINARIOS COMPLETOS Un árbol binario se llama completo si todos sus nodos, excepto las hojas, tienen exactamente dos subárboles. Un árbol binario completo, tal que todos los niveles están llenos, se llama árbol binario lleno Un árbol binario completo puede tener como máximo 2 h -1 Por ultimo se denomina árbol degenerado un árbol en le que todos sus nodos tienen solamente un subárbol, excepto el ultimo. (a) Árbol Binario lleno de altura (b) Árbol Binario Completo de altura 3. Otros Conceptos: Un árbol binario es un árbol con raíz en el que cada nodo tiene como máximo dos hijos. Un árbol binario lleno es un árbol en el que cada nodo tiene cero o dos hijos. Un árbol binario perfecto es un árbol binario lleno en el que todas las hojas (vértices con cero hijos) están a la misma profundidad (distancia desde la raíz, también llamada altura). A veces un árbol binario perfecto es denominado árbol binario completo. Otros definen un árbol binario completo como un árbol binario lleno en el que todas las hojas están a profundidad n o n-1, para alguna n. Conversión de un árbol General a Binario Dado que los árboles binarios son la estructura general en la teoría de árboles, será preciso disponer de algún mecanismo que permita la conversan de un árbol general en un árbol binario. Los árboles binarios son mas faciales de programar que los árboles genérales. En estos es imprescindible deducir cuantas ramas o caminos se desprenden de un nodo en un momento dado. Por ello, y dado que de los árboles binarios siempre se cuelgan como máximo dos subárboles su programación será más sencilla. Afortunadamente, existe una técnica para convertir árbol general a binario para ello, debemos seguir los pasos que se describen a continuación: 1.Enlazar el nodo raíz con el camino que conecta el nodo mas a la izquierda (su hijo) 2.Debe eliminarse el vínculo de ese padre con el resto de sus hijos y enlazar los nodos hermanos en una sola línea con el fin de formar un solo nivel 3.Rotar el diagrama resultante aproximadamente 45 grados hacia la izquierda, y así se obtendrá el árbol binario correspondiente. Ejemplo de conversión de árbol Genera a Binario ARBOL GENERAL PASO 1 PASO 2 PASO 3 (RESULTADO) RECORRIDO EN ÁRBOLES BINARIOS Una de las operaciones mas importantes a realizar en un árbol binario es el recorrido de los mismos, recorrer significa visitar los nodos del árbol en forma sistemática, de tal manera que todos los nodos del mismo sean visitados una sola vez. Existen 3 formas diferentes de efectuar el recorrido y todas ellas de naturaleza recursiva, estas son: RECORRIDO PREORDEN: En el que se procesa el nodo y después se procesan recursivamente sus hijos. RECORRIDO POSTORDEN: Donde el nodo dado se procesa después de haber procesado recursivamente a sus hijos. RECORRIDO INORDEN: En este se procesa recursivamente el hijo izquierdo, luego se procesa el nodo actual y finalmente se procesa recursivamente el hijo derecho. RECORRIDO PREORDEN VISITAR LA RAIZ RECORRER EL SUBARBOL IZQUIERDO RECORRER EL SUBARBOL DERECHO Recorrido en preorden: consiste en visitar el nodo actual (visitar puede ser simplemente mostrar la clave del nodo por pantalla), y después visitar el subárbol izquierdo y una vez visitado, visitar el subárbol derecho. Es un proceso recursivo por naturaleza. PREORDEN: A-B-D-E-C-F-G RECORRIDO POSTORDEN En este caso se trata primero el subárbol izquierdo, después el derecho y por último el nodo actual. POSTORDEN: 2, 5, 11, 6, 7, 4, 9, 5 y 2. RECORRIDO INORDEN En este caso se trata primero el subárbol izquierdo, después el nodo actual y por último el subárbol derecho. En un AB este recorrido daría los valores de clave ordenados de menor a mayor. En el árbol de la figura el recorrido en inorden sería: 2, 7, 5, 6, 11, 2, 5, 4 y 9. Conclusión Entonces podemos decir que el árbol es una estructura de datos fundamental en la informática ya que se utiliza en distintos campos de la misma. También se podría decir que un árbol binario se define como un conjunto finito de elementos llamados nodos. En estos casos se puede usar terminología de relaciones familiares para descubrir las relaciones entre los nodos de un árbol; y que un árbol puede ser implementado fácilmente en una computadora. Es bueno hacer énfasis en esto ya que se puede saber mucho sobre lo que tiene que ver con los árboles; entre las cosas que podemos mencionar se encuentra la raíz, los nodos de un árbol y la diferencia entre nodos sucesores y nodos terminales, como se muestran en el contenido del trabajo. Anexo Formas de representación - Mediante un grafo: Figura 1 Algoritmo: Recorrido(Arbol, N) Si N ≠ 0 i -> Mientras i < N Imprimir Arbol i -> i + 1 //Fin del ciclo// Salir //Fin de la condición// Imprimir "Arbol Vacio..." Salir Corrida: Bibliografía Libro: Estructura de datos y organización de archivos. Autora: Mary E. S. Loomis. Pagina web consultadas: www.google.com http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/Ejer_AG.htm http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/Ejer_AB.htm

0
0
G
grafos.trabajo practico
TaringaporAnónimo3/26/2010

Índice Pág. Introducción……………………………………….……………. 4 Grafos- Conceptos.…..…......................................................5 Trayectorias…………………………………….………............6 Ciclos………………………………………...............................7 Grafos Dirigidos……………...................................................8 Grafos en Programas ………………….................................9 Matrices dispersas ..............................................................11 Aristas ponderadas .............................................................12 Representaciones ligadas.....................................................14 Representación de directorio de nodos................................15 Representación de multi- lista...............................................17 Recorrido de grafos ,amplitud y profundidad........................19 Conclusión ……………………………………………………...25 Introducción En este trabajo se tratará de explicar lo que son los grafos, sus tipos, y algunas derivaciones de ellos, así como su representación gráfica y en algunos casos, su representación en algún programa informático, así como en la memoria. En este trabajo, se explica de manera muy sencilla los conceptos y algunas metodologías con un lenguaje no tan rebuscado para su mayor entendimiento. Los grafos son artefactos matemáticos que permiten expresar de una forma visualmente muy sencilla y efectiva las relaciones que se dan entre elementos de diversas índoles Grafos Un grafo es un conjunto de puntos y un conjunto de líneas con cada línea se une un punto a otro. Los puntos se llaman los nodos del grafo, y las líneas se llaman aristas. Denotemos al conjunto de nodos de un grafo dada G, por VG y, al conjunto de aristas, por EG .Por ejemplo, en el grafo G de la figura 7-1, VG = ( a,b,c,d ) y EG= (1,2,3,4,5,6,7,8). El número de elementos de VG es llamado el orden del grafo G. Un grafo nulo es un grafo con orden cero. Una aristas está determinada por los nodos que conecta .La arista 4, por ejemplo ,conecta los nodos c y d y se dice que es de la forma (c,d).Un grafo está completamente. Figura 7-1 Ejemplo de grafo Definido por sus conjuntos de nodos y aristas .La posición real estos elementos en la página no tiene importancia .La gráfica de la figura 7-1 es equivalente al grafo de la figura 7-2. Figura 7-2 Grafo equivalente a la figura 7-4 Nótese que puede haber varias aristas conectando a dos nodos, por ejemplo, los arcos 5,6 y 7 todos son de la forma (b,d). Algunos pares de nodos pueden estar desconectados Por ejemplo, no hay aristas de la forma (a,c) o (a,d) Algunas aristas pueden conectar un nodo a si mismo, por ejemplo la arista 8 es de la forma (a,a), a aristas se le llaman BUCLES Un grafo G se llama grafo simples las siguientes condiciones son válidas. 1.No tiene ciclos, esto es, no existe una arista EG de la forma (vv), donde V esta en VG 2.No hay mas de una arista uniendo un par de nodos, esto es, no existe mas de una arista en EG de la forma (v1, v2), para cualquier par de elementos v1 y v2 en VG. La figura 7-3 muestra un grafo simple derivado del ejemplo mostrado en la figura 7-4. Un grafo que no es simple algunas veces es llamado multigrado. Encontrará, que las aristas también se les conocen como arcos y a los nodos como vértices. Un grafo conexo es una gráfica que no se puede dividir en dos gráficas, sin eliminar por lo menos una de las aristas. El grafo de la figura 7-4 es un grafo no conexo. Figura 7-3 Ejemplo de grafo simple derivado de la figura 7-1. Figura 7-4 Ejemplo de un grafo desconectado. Trayectorias Una trayectoria en un grafo es una, secuencia de una o mas aristas que conecta a dos nodos. Denotamos por P(Vp Vj) a una trayectoria que conecta a los nodos Vi y Vj. Para que P(Vp Vj) exista, debe hacer en EG una secuencia de arcos de la siguiente forma: P(Vp Vj) = (Vp V1) (Xp X2) . . . (Xn-p Xn) (Xn’ Vj) La longitud de la trayectoria es el número de aristas que la componen. En el grafo simple de la figura 7-3 se tienen las siguientes trayectorias entre los nodos b y d: P(b,d)= (b,c) (c,d) de longitud P(b,d)= (b,c) (c,d) (b,c) (c,d) de longitud P(b,d)= (b,d) de longitud P(b,d)= (b,c) (c,d) (b,d) de longitud En general, sólo estamos interesados en trayectorias en las cuales un nodo dado es “visitado” no mas de una vez. Esto restringe nuestro interés a la primera y tercera trayectorias anteriores. La segunda trayectoria visita dos veces a los nodos b y c, la cuarta trayectoria visita al nodo b dos veces. Siempre estaremos interesados en no recorrer la misma arista dos veces en una trayectoria. Esto evitará que nuestros algoritmos se tarden mucho por regresar sobre sus pasos. Ciclos Un ciclo es una trayectoria sobre la cual se cumple con las siguientes dos condiciones: 1.Ninguna arista puede aparecer mas de una vez en una secuencia de aristas. 2.El nodo inicial de la trayectoria es el mismo que el nodo Terminal, es decir, P(v,v). En otras palabras, un ciclo regresa a su punto de inicio. El grafo de la figura 7-2 tiene varios ciclos, por ejemplo: P(a,a) = (a,a) P(b,b)= (b,c) (c,d) P(b,b)= (b,c) (c,d) (d,b) P(d,d)= (d,b) (b,c) (c,d) P(d,d)= (d,b) (b,d) Un grafo sin ciclos se dice que es acíclica. Las figuras 7-5 a) y b) representan grafos acíclicos. Figura 7-5 Ejemplo de grafos aciclicos Grafos Dirigidos Otro caso especial de la estructura de grafos general es le grafo dirigido, en el cual se les asigna dirección a las aristas de la gráfica. Se proporciona un ejemplo en la figura 7-6. Figura 7-6 Ejemplo de un grafo dirigido Cada arista del grafo dirigido incluye una flecha para indicar la dirección. El grado interno de un nodo en un grafo es el número de aristas que terminan en un nodo; el grado externo de un nodo, es el número de aristas que salen de este nodo. El grado de un nodo es la suma de sus grados internos y externos . Por ejemplo, en la figura 7-6 los valores son: Grado-interno(a)= 1 Grado- externo(a)= 2 Grado(a)= 3 Grado-interno (b)= 4 Grado- externo(b)= 2 Grado(b)= 6 Grado-interno(c)= 1 Grado- externo(c)= 2 Grado(c)= 3 Grado-interno (d)= 2 Grado- externo(d)= 2 Grado(d)= 4 A lo largo de este capítulo nos referimos a los nodos de los grafos por sus etiquetas. En realidad, un nodo puede contener cualquier clase de información. Tendremos a ignorar el contenido de estos nodos, sin embargo, no olvide que en última instancia el propósito de gráficas y árboles es el de representar la estructura lógica de esta información. Grafos en Programas Tal y como hemos estudiado otras estructuras de datos en capítulos anteriores, el tipo de datos llamados grafos no esta predefinido en los lenguajes de programación comunes. Por esto, las características del grafo se simulan, alojándolas en otra estructura de datos. Existen tres formas principales para representar grafos, representación matricial, representación de lista y representación de multi-lista. Después de considerar cada una de éstas entraremos en la discusión de algunas de las operaciones mas comunes sobre grafos: recorrido de gráficas y análisis de trayectorias Representación de la Matriz de Adyacencias Considere un grafo G con un conjunto de nodos VG y un conjunto de arcos EG . Suponga que la gráfica es de orden N, para N> =1 .Una de representar esta gráfica es utilizando una matriz de adyacencias,la cual es de un arreglo de A de N-por-N, donde 1 si y solo si la arista Vi,Vj está en EG A(i,j) = 0 en otro caso Si hay una arista que conecta los nodos i y j, entonces A (i,j)=1 La matriz del grafo no dirigida, mostrada en la figura 7-7 es ; figura 7-7 Ejemplo de grafo no-dirigido i\j 1 2 3 4 5 6 1 0 1 0 0 0 0 2 1 1 1 0 0 0 3 0 1 0 1 1 1 5 0 0 1 0 0 0 6 0 0 1 0 0 0 Grafos dirigidos Una arista de un grafo dirigido tiene su fuente en un nodo y su final en otro nodo,Por convención, la arista (VpVj) denota la dirección del nodo dirigido de la figura 7-8 es figura 7-1 Ejemplo de grafo dirigido i\j 1 2 3 4 5 6 1 0 1 0 0 0 0 2 0 1 1 0 0 0 3 0 0 0 0 1 1 5 0 0 0 0 0 0 6 0 0 0 0 0 0 Matrices dispersas Un grafo de orden N tiene una matriz de adyacencia de N-por-N .En muchos casos estas matrices de adyacencia son matrices dispersas y se pueden almacenar como arreglo dispersos . En estos casos , la representación matricial en general no es tan recomendado como la forma de listas ligadas La matriz de adyacencia de un grafo no dirigido es simétrica. Por lo tanto, aun cuando la matriz no sea dispersa, los requerimientos de almacenamiento pueden reducirse casi a la mitad al almacenar sólo el triángulo superior (o inferior ) de la matriz. Definición de grafos en COBOL y en PASCAL La siguiente definición del arreglo puede ser usado para declarar un grafo llamado GRAFICA, de orden 24,en COBOL.La gráfica requiere de una matriz de adyacencias de 24 por 24 01 GRAFO 02 REGLÓN OCCURS 24 TIMES 03 COLUMNA OCCURS 24 TIMES 04 ARCO PIC 9 El ARCO ( I, J ) tiene entonces el valor de 1 si existe una arista entre los nodos I y J y 0 En otro caso otra forma para interpretar una matriz de adyacencia es como un tipo de datos boléanos .Por ejemplo , en Pascal: Type grafo: array [ 1….24,1…..24] of bolean Aquí el grafo [i,j] tiene el valor de trae (verdadero) si existe una arista entre los nodos i y j, y false (falso) en otro caso Cálculo de aristas Por lo general es conveniente hacer aritmética en matrices de adyacencia. Por ejemplo, el grado del nodo i en un grafo es: N ∑ A( i ,j ) J=1 El grado interno de un nodo i en un grafo dirigido es la suma de las columnas de la matriz: N ∑ A( k ,i ) k=1 Y el grado externo del nodo i es la suma de los reglones de la matriz: N ∑ A( i ,k ) k=1 Discutiremos otros resultados comunes de la manipulación de datos adyacentes más adelante en el capítulo. Si la matriz de adyacencia se define de tipo booleano , entonces estas manipulaciones comunes no son realmente tan simples. En lugar de sumas, se requiere de una serie de operaciones booleanas ( and y or ) Aristas ponderadas Existen muchas aplicaciones de grafos en las cuales la matriz de adyacencia es la representación adecuada. Considérese la gráfica que se muestra en la figura 7-9 la cual se puede ser usar en un sistema de información de una compañía de transporte. Este seria un ejemplo de un grafo de aristas ponderadas. Los nodos representan a las ciudades y las aristas representan las trayectorias de tráfico entre las ciudades. Cada arista se etiqueta con la distancia entre un par de ciudades interconectadas. En lugar de usar un matriz de bits para representar este sistema de transporte, podemos usar una matriz de aristas ponderadas Figura 7-9 Ejemplo de grafo que muestra las distancias entre ciudades Donde el nodo 1=ABQ 6=HST 11=ORD 16=SPK 2=CVJ 7=KNC 12=PHX 3=DFW 8=LAX 13=SEA 4=DNV 9=NSH 14=SFO 5=ELP 10=NOR 15=SLC Las aristas ponderadas se usan con frecuencia en aplicaciones de transporte, donde los pesos representan normalmente las distancias, como en las figuras anteriores. En aplicaciones de flujos, los pesos representan las capacidades. Por ejemplo, los nodos en un grafo pueden representar la capacidad en litros por minuto, de una línea de ductos de transporte de líquidos entre diversas localidades, o la capacidad en bits /seg. De comunicación de red de computadora. En otras aplicaciones, el peso de las aristas representa el tiempo. Por ejemplo, pueden utilizar las graficas para representar redes de actividades, donde cada arista representa una tarea o actividad. Cada nodo representa un evento: la terminación del conjunto de actividades representadas por las aristas que llevan a cada nodo. Representaciones ligadas La representación de un grafo,usando la técnica de matriz de adyacencias requiere de almacenamiento de infomación de las aristas, para cada posible par de nodos. P ara una grafica de N nodos, con pocas aristas en relación a las NxN posibles conexiones, una representación ligada resulta ser mas adecuada. La representación ligada solamente almacena la información de las aristas que existen. A medida que las aristas se suman o se borran de la gráfica ligada, se debe modificar la representación en consecuencia. Existen dos tipos fundamentales de estructuras ligadas para representar grafos: una se lama representación de directorio de nodos y la otra representación de multi-lista. Representación de directorio de nodos La representación de directorio de nodos incluye dos partes; un directorio y un conjunto de listas ligadas. Hay una entrada en el directorio para cada nodo del grafo. La entrada del directorio para el nodo i apunta a una lista ligada, que representa los nodos que están conectados al nodo i. Cada registro de la lista ligada tiene dos campos; el primero es una identificación del nodo, y el otro es una lista liga al siguiente elemento de la lista. El directorio representa nodos y, la lista ligada representa aristas. Figura 7-11 Representación de directorio de nodos de la figura 7-7 Un grafo dirigido de orden N con E aristas, requiere de N entradas en el directorio y E entradas de listas ligadas. La lista ligada encabezada por la i-ésima entrada del directorio corresponde al i-ésimo renglón de la matriz de adyacencia. Las entradas del directorio se ordenan secuencialmente de acuerdo al identificador del nodo. Aunque también hemos ordenado las entradas de la lista ligada según el nodo identificador, podrán haber aparecido en cualquier orden, puesto que cada entrada contiene la identidad del nodo. Aristas ponderadas Representar un grafo con aristas ponderadas, requiere reservar espacio en la estructura de datos para el almacenamiento de los pesos. La figura 7-13 muestra un grafo dirigido con aristas ponderadas. Este ejemplo en particular es el de un grafo d actividades: cada nodo representa un evento y cada arista representa una tarea que, al contemplarse ayuda a dispersar el siguiente evento, que inicia otras tareas. Cada peso de arista es su tiempo requerido. Esta clase de grafo es comúnmente usada en sistemas de administración de proyectos. Una representación de directorio de nodos para este grafo se muestra en la figura 7-14. El registro para cada entrada de arista y un apuntador al siguiente nodo, que tenga el mismo nodo fuente. NODO PESO SIGUIENTE Figura 7-14 Representación de direcciones de grafo de la figura 7-13 Cálculo de aristas Para determinar el gado de un nodo, en un grafo no dirigido, se requiere contar el número de entradas en su lista ligada. El grado externo de un nodo, en un grafo dirigido, también puede ser determinado contando el número de entradas en su lista ligada. Para facilitar la localización de nodos anteriores y la determinación de los grados internos puede utilizarse un directorio auxiliar de aristas que llegan a los nodos. Algunos tipos de de análisis de grafos se facilitan mas al usar matrices de adyacencias, en lugar de listas ligadas. Si un grafo tiene una estructura altamente volátil, entonces puede requerir menos trabajo el agregar o borrar aristas en una representación de matriz de adyacencia, que en la de un directorio de nodos. Cambiar una entrada a una matriz es, generalmente mas rapido que agregar (o borrar) otras entradas en una lista ligada. Representación de multi- lista Es una representación de multi-lista de estructuras de grafos, hay que considerar de nuevo dos partes: un directorio de información de nodos y un conjunto de listas ligadas de información de aristas. Hay una entrada en el directorio de nodos para cada nodo del grafo. La entrada del directorio para el nodo i apunta a una lista ligada de adyacencia para el nodo i. Cada registro de la lista ligada aparece en dos listas de adyacencia; una para cada nodo en cada extremo de la arista representada. Usando la estructura de datos de la figura 7-15, para cada entrada d la arista (Vp Vj). NODO 1 NODO 2 ID ADJ ID ADJ Una representación alternativa, basada en el conjunto de aristas {(2,1),(2,2),(2,3),(3,4),(5,3),(3,6)} se muestra en la figura 7-17. Si el grafo fuera dirigido, no habría tal flexibilidad en la selección de identificadores para las aristas. Figura 7-16 Representación multi-lista de la figura 7-7 Una declaración en Pascal de una representación multi-lista para un grafo ponderado de orden 24, es la que sigue: Type id-nodo= 0..24 tipo-nodo= 1 info-arco; apt-arco= 1 info-arco info-arco= record nodo-.1: id-nodo; nodo-2: id-nodo; lista-adj-1: apt-arco; lista-adj-2: apt-arco; peso: integer End; Grafo = array [1..24] of tipo ¡-nodo; Figura 7-17 Otra representación de multi- lista de la figura 7-7 Recorrido de grafos En muchas aplicaciones es necesario visitar todos los nodos de un grafo por ejemplo; al necesitar imprimir todos los eventos de un grafo de actividades (por ejemplo, figura7-13), o para determinar que ciudades están influidas en un mapa de distancias (figura 7-9), o determinar total entre ciudades. En el mapa de distancias. Las dos técnicas básicas de recorrido de grafos que representamos aquí son: recorrido en amplitud y recorrido profundidad. Recorrido en amplitud En un recorrido de amplitud de grafos, un nodo se selecciona como posición inicial, éste se visita y se marca después, todos los nodos no visitados, adyacentes a ese nodo, visitan y se marcan en algún orden secuencial. El recorrido en amplitud del grafo (figura 7-13) resulta n le orden siguiente: 1,2,3,4,5,6,7,8. La secuencia 1,3,2,6,5,4,7,8 también es un orden de visita válida para el recorrido en amplitud. El algoritmo de recorrido utiliza una cola para almacenar los nodos, de cada “nivel” del grafo que se visita. Estos nodos almacenados son tratados uno por uno, luego sus nodos adyacentes son visitados, y así sucesivamente hasta que todos los nodos hayan sido visitados. El algoritmo puede implantarse en Pascal como sigue: Type id-nodo= 0... orden-grafo apt-arco= 1 info-arco tipo nodo= record marca: 0..1; lista-ady: apt-arco; End; Info-arco= record nodo:id-nod; Peso: integer; Sig: apt-arco End; Tipo-grafo = array [1..orden-grafo] of tipo-nodo; Var gráfica: tipo-gráfico; Primer-nodo:id-nod; El procedimiento iteractivo puede programarse como sigue: Procedure amplitud (primer-nodo:id-nodo); Var: estructura-cola; Nodo-guardado: id-nodo; Apt-ady: apt-arco; Begin {aquí visita al primer nodo} Grafo[primer-nodo].marca : = 1; Insertar (primer-nodo); While g.frente<>0 Do begin suprimir (nodo-guardado); Apt-ady: =grafo [nodo-guardado].lista-ady; {Visita el nodo adyacente al nodo-guardado} While apt-ady <> nil Do begin nodo-guardado: = apt-ady l .nodo; If (grafo {nodo-guardado}.marca = 0) Then begin insertar (nodo-guardado); {Aquí se visita el nodo-guardado} Grafo {nodo-guardado}.marca: = 1 End: Apt-ady : = apt l. sig End; End; End; Recorrido en profundidad Mientras que el recorrido en amplitud procede nivel por nivel, el recorrido en profundidad sigue primero una trayectoria desde el nodo inicial hasta un nodo Terminal, después otra trayectoria desde el mismo punto inicial hasta alcanzar otro nodo final, y así sucesivamente hasta que todos los nodos hayan sido visitados. Una secuencia igualmente válida como resultado del recorrido en profundidad es el siguiente: 1,3,6,7,8,5,4. El recorrido en amplitud se describió fácilmente usando un procedimiento iteractivo; el recorrido en profundidad conduce hacia una definición recursiva. El código en Pascal para implantar el recorrido de gráficas en profundidad es como sigue: Procedure profundidad (var este-nodo: id-nodo) Var nodo-guardado: id-nodo; Apt-ady: apt-arco; Begin {este-nodo es visitado aqui} Grafo {este-nodo}.marca: = 1; Apt-ady. = grafo [este-nodo].lista-ady; While apt-ady <> nil Do begin nodo-guardado: = apt-ady l.nodo; If (grafo[nodo-guardado].marca = 0) Then profundidad (nodo-guardado); Apt-ady: = apt-ady l.sig End; End; La multiplicación de matrices convencional se usa para encontrar A2. Es decir, el elemento i j-ésima de A2 es el resultado de multiplicar e renglón i por la columna j de A: El problema de determinar cuando un par de nodos están, o no, conectados, se resuelve entonces encontrando: N ∑ Ak ,Ak ) k=1 Cuyo resultado es una matriz llamada cerradura transitiva de A, con frecuencia denotada por A. En realidad no se necesita realizar la suma de N veces, donde N es el orden de la gráfica, sino solo tantas veces como la longitud de la trayectoria mas larga. La cerradura transitiva de A es también es denominada como matriz de alcance de A. Trayectorias más cortas Además de determinar si el nodo j se puede alcanzar el nodo i es de común interés encontrar la trayectoria mas corta desde el nodo i al nodo j. El desarrollo del algoritmo se deja como ejercicio y solo haremos un par de observaciones acerca de la trayectoria mas corta aquí. Hay varias rutas posibles entre muchos pares de ciudades. Note que: 1.Las trayectorias mas cortas se detectan en orden no decreciente de sus distancias, es decir, el siguiente nodo destino es aquel con la distancia mínima desde el nodo fuente de todos aquellos nodos que aun no son seleccionados. 2.La trayectoria mas corta al siguiente nodo destino pasa a través de los nodos que ya fueron seleccionados. S i los pesos de aristas tuviesen que representar costos en lugar de distancias, el mismo algoritmo podría usarse para detectar las trayectorias mas económicas. Si esos pesos representasen velocidades (por ejemplo, kilobits/seg), entonces el algoritmo podría modificarse fácilmente para detectar las trayectorias mas rápidas. DNV – ABQ 334 DNV – SLC 371 DNV – KNC 558 DNV – ABQ - ELP 334 + 229 =563 DNV – ABQ – PHX 334 + 330 =664 DNV – SLC – SPK - 371 + 550 =921 DLV – SLC – SFO - 371 + 600 =971 DNV - KNC – ORD – 558 + 414 =972 Conclusión Estamos en una época en la que queremos que las máquinas piensen por nosotros. El esfuerzo que debe realizar la máquina (y su diseñador) es infinitamente superior a la cantidad de trabajo que alivia a cada usuario. Esta tarea de investigación es, sin embargo, necesaria para el desarrollo de la sociedad de la información. La complejidad del conocimiento crece de manera exponencial a medida que vamos incorporándolo a nuestro saber. Por esto necesitamos aislar un conocimiento de otro y trabajar con cada uno de manera separada y eficiente. Podemos ayudarnos de las máquinas para procesar este conocimiento por nosotros. Este trabajo nos facilitará en la solución de problemas en la que nos vemos ligados día a día

0
8
que es java?
que es java?
TaringaporAnónimo10/20/2010

¿Qué es Java? Hacia 1990, James Gosling, quien trabaja para Sun Microsystems, fue el encargado de crear programas para controlar aparatos electrónicos domésticos. Originalmente Gosling y su equipo empezaron el diseño de su software usando C++, debido a su orientación a objetos. Sin embargo, se dieron cuenta que C++ no satisfacía los proyectos que se tenían en mente; encontraron dificultades con aspectos complicados de C++ como la herencia múltiple de clases, errores de programación (bugs) relacionados con huecos de memoria. De esta manera Gosling decidió que tenía que empezar por escribir un lenguaje simplificado que le evitara todos los problemas que se encontró con C++. Aunque a Gosling no le importó la complejidad de lenguajes como C++, tomo la sintaxis básica y la orientación a objetos del lenguaje. Cuando terminó el nuevo lenguaje lo llamó Oak (se cuenta que el nombre le vino a Gosling mientras veía un roble por la ventana de su oficina.) Oak se uso por primera vez en un proyecto llamado Proyecto Green, donde el equipo de desarrollo intentó diseñar un sistema de control para usar dentro del hogar. Este sistema de control permitiría al usuario manipular distintos dispositivos, como televisiones, video caseteras, luces caseras y teléfonos, todo desde una computadora de mano llamada *7 (Star Seven). El sistema *7 incluía una pantalla sensible para que el dueño seleccionara y controlara estos dispositivos. La pantalla del *7 tenía diversas figuras, entre las que se encontraba Duke (la actual mascota de Java). Duke ha sido incluido en muchos ejemplos de applets en la página de Sun Microsystems. El siguiente paso para Oak fue el proyecto Video En Demanda (VOD), en el que el lenguaje era usado como la base para el software que controlaría un sistema de televisión interactivo. Aunque ni *7 ni el proyecto VOD concluyeron en productos actuales, le dieron a Oak una oportunidad de crecer y madurar. Con el tiempo Sun Microsystems descubrió que el nombre Oak ya había sido usado y le cambió el nombre por Java, y vio nacer un lenguaje poderoso y sencillo. Java es un lenguaje independiente de la plataforma, lo que significa que los programas desarrollados en Java correrán en cualquier sistema sin cambios. Esta independencia de plataforma se logró usando un formato especial para los programas compilados en Java. Este formato de archivo, llamado "byte-code" puede ser leído y ejecutado por cualquier computadora que tenga un intérprete de Java. Este intérprete de Java, por supuesto, debe ser escrito especialmente para el sistema en el que correrá. En 1993, después de que Internet se transformó de un ambiente basado en texto a un ambiente gráfico, el equipo de Java se dio cuenta de que el lenguaje sería perfecto para la programación en el Web. Así nació la idea de los applets, que son pequeños programas que pueden ser incluidos en páginas de Web, y también surgió la idea de escribir un navegador de Web que demostraría el poder del lenguaje, este navegador es el HotJava. Finalmente, hacia mayo de 1995, Sun Microsystems anunció oficialmente a Java. El nuevo lenguaje fue aceptado como una poderosa herramienta para el desarrollo de aplicaciones para Internet. Netscape Communications, el creador del navegador Netscape Navigator, dio soporte a Java desde su versión 2.0. Otros desarrolladores de software también incluyeron soporte para Java, incluyendo al Internet Explorer 3 de Microsoft. Actualmente, Java puede correr en máquinas con procesadores SPARC, Intel, Digital. De acuerdo con Sun Microsystems, Java es "simple, orientado a objetos, tipificado estáticamente, compilado, independiente de arquitectura, multi-procesos, con recolector de basura, robusto, seguro y ampliable." Es simple porque los desarrolladores en Java deliberadamente dejan muchas de las características innecesarias de otros lenguajes de programación de alto nivel. Por ejemplo, Java no soporta aritmética de apuntadores, cast de tipos implícito, estructuras o uniones, sobrecarga de operadores, plantillas, archivos de cabecera o múltiple herencia. Es orientado a objetos, porque como C++, Java usa clases para organizar el código en módulos. En tiempo de ejecución, un programa crea objetos a partir de las clases. Las clases en Java pueden heredar de otras clases, pero la múltiple herencia, donde una clase hereda métodos y datos de varias clases, no está permitida. Es tipificado estáticamente porque todos los objetos usados en un programa deben ser declarados antes de que puedan ser usados. Esto permite al compilador de Java localizar y reportar conflictos con los tipos de datos. Es compilado porque antes de que se pueda correr un programa, primero tiene que ser compilado por el compilador de Java. El resultado de la compilación es el archivo "byte-code", que, similar a un archivo con código máquina, puede ser ejecutado bajo cualquier sistema operativo que tenga un intérprete de Java. Este intérprete lee el archivo byte-code y traduce los comandos en comandos de lenguaje máquina que pueden ser ejecutados directamente por la computadora. Es multiprocesos porque los programas de Java pueden contener múltiples procesos en ejecución, lo que permite a los programas manejar varias tareas simultáneamente. Por ejemplo, un programa multiprocesos puede definir una imagen (render) en un proceso mientras continua aceptando entrada del teclado en el proceso principal. Todas las aplicaciones tienen al menos un proceso (llamado thread) que representa la ejecución del programa. Tiene recolector de basura, ya que los programas de Java no se encargan de liberar de memoria los objetos, esto es una tarea del administrador de memoria y el recolector de basura. Es robusto porque el intérprete de Java revisa todos los accesos al sistema dentro de un programa, por esto, los programas desarrollados en Java no pueden tirar el sistema. Esto es, cuando un error serio es encontrado, los programas en Java crean una excepción. Esta excepción puede ser capturada y manejada por el programa sin el riesgo de bloquear el sistema. Es seguro porque el compilador no sólo verifica todos los accesos a memoria, sino que también se asegura que no entren virus en un applet en ejecución. Ya que los apuntadores no son soportados por el lenguaje, los programas no pueden acceder a áreas del sistema a las que no tienen autorización. Es ampliable porque los programas en Java soportan métodos nativos, que son funciones escritas en otros lenguajes, generalmente C++. Este soporte a métodos nativos permite a los programadores escribir funciones que pueden ser ejecutadas más rápido que las funciones equivalentes escritas en Java. Los métodos nativos son ligados a los programas en forma dinámica, es decir, son asociados con los programas en tiempo de ejecución. Ventajas de Java. Desventajas de Java. Es seguro. Es 10 a 20 veces más lento en ejecución que C++. Se aprende con facilidad. Soportado por Microsoft. Es orientado a objetos. No bloquea el sistema. Es independiente de la plataforma. No tiene aritmética de apuntadores. Aplicaciones para comunicación en red. Java tiene las siguientes características: • La Máquina Virtual de Java (JVM) • Recolección de basura • Seguridad en el código La especificación de la Máquina Virtual de Java define a ésta como: "Una máquina imaginaria que es implantada por la emulación de software en una máquina real. El código para la JVM es almacenado en archivos .class, cada uno contiene código para al menos una clase pública". Esta especificación permite a los programas Java ser independientes de la plataforma porque la compilación es hecha por una máquina genérica. Al intérprete de Java de cada plataforma de hardware le corresponde asegurar la ejecución del código compilado para la JVM. Muchos lenguajes de programación permiten el alojamiento dinámico de memoria en tiempo de ejecución. Este proceso varía en la sintaxis de los lenguajes, pero siempre hay un valor de retorno de un apuntador a la dirección de inicio del bloque de memoria. Una vez que la memoria ocupada ya no se necesita, el programa o el ambiente de ejecución debería liberar la memoria para prevenir que el programa corra sin memoria disponible. En C y C++ (y otros lenguajes), el programador es responsable de liberar la memoria. Esto puede ser tedioso, porque no se sabe con anticipación cuando se va a liberar memoria. Los programas que no liberan memoria pueden bloquear el sistema cuando no queda memoria disponible. Java quita esa responsabilidad de liberar memoria explícitamente integrando un proceso a nivel de sistema que sigue cada alojamiento de memoria y mantiene una cuenta del número de referencias a cada apuntador a memoria. Durante los intervalos de tiempo de ocio en la JVM, el proceso de recolección de basura revisa si hay apuntadores a memoria donde el número de referencias es igual a cero. Si hay algunos, el bloque de memoria marcado por el recolector es liberado. Una vez compilados los programas en Java, en el momento de ejecución se lleva a cabo una tarea de carga, revisión y ejecución. La carga consta de cargar en memoria el archivo byte-code, puede cargarse desde la máquina local o remotamente a través de la red. La revisión consta de verificar que no haya: violaciones de acceso, operaciones que conduzcan a "overflow" o "underflow", tipos de parámetros incorrectos, conversiones de datos incorrectas, acceso a objetos sin inicializar, entre otras funciones. En el proceso de ejecución ya se corren las instrucciones del programa. Comentarios Los comentarios en Java se pueden escribir en tres formas: // comentario de una línea /* comentario de una o más líneas */ /** comentario para documentación */ Los comentarios de documentación se colocan justo antes de la variable o función. Estos sirven para el programa javadoc, el cual genera archivos html, y sirven como una descripción del tópico declarado. En Java, un identificador empieza con una letra, el carácter de subraya o el signo $. Los demás caracteres pueden contener dígitos. Todos los identificadores son sensibles a mayúsculas / minúsculas. Ejemplos de identificadores validos: variable nombreUsuario Nombre_Usuario _numero $cadena Los últimos tres ejemplos son muy poco usados en la generalidad de los programas. Los identificadores pueden contener palabras reservadas, pero no pueden ser palabras reservadas; por ejemplo, es valido integer, pero no int. Palabras reservadas Abstract, do, implements, private, throw, Boolean, double, import, protected, throws, break, else, instanceof, public, transient, byte, extends, int, return, true, case, false, interface, short, try, catch, final, long, static, void, char, finally, native, super, volatile, class, float, new, switch, while, continue, for, null, synchronized, default, if, package, this. Nota.- En Java, true, false y null se escriben en minúsculas, al contrario que en C++. No existe un operador sizeof; el tamaño y representación de todos los tipos es fija y no es dependiente de la implantación. Las palabras goto y const no se usan en Java. Tipos de datos Java define ocho tipos de datos primitivos y uno especial. Se pueden agrupar en: lógicos, textuales, integrales y de punto flotante. El tipo de dato boolean sólo tiene dos valores: false y true. En C/C++ se permite que valores numéricos sean interpretados como valores lógicos, pero no es el caso de Java; sólo se permiten valores lógicos. Los tipos de datos textuales son: char y String. Los caracteres se representan por el tipo de dato char, usando 2 16 - 1 un número de 16 bits sin signo con un rango de cero a . Los caracteres se encierran entre apóstrofes. 'a' Letra a 't' Un tabulador 'u????' Un carácter especifico, ???? es reemplazado con cuatro dígitos hexadecimales. El tipo String, que no es primitivo, es usado para representar secuencias de caracteres. Una cadena de caracteres se encierra entre comillas. "Esto es un mensaje" Los tipos integrales son: byte, short, int y long. Todos son números con signo. Los números se pueden representar en forma decimal, octal o hexadecimal. 2 Valor decimal es dos 077 El cero que inicia indica un valor octal 0xBC27 0x indica un valor hexadecimal Para especificar un valor long se debe poner L al final del número. Se puede usar l o L, pero en minúscula se puede confundir con el número 1 en algunos casos. 2L Valor decimal dos, como un valor largo 077L El cero que inicia indica un valor octal 0xBC27L 0x indica un valor hexadecimal A continuación se presenta una tabla con los cuatro tipos de datos. La representación del rango es definida por la especificación del lenguaje como un complemento a dos y es independiente de la plataforma. Tamaño Tipo Rango - 2 2 7 7 - 1 8 bits byte ... - 2 2 15 15 - 1 16 bits short ... - 2 2 - 31 31 1 32 bits int ... - 2 2 - 63 63 1 64 bits long ... Los tipos de dato para número de punto flotante son: float y double. Un valor en punto flotante puede incluir el punto decimal, una parte exponente (letra E), o es seguido por la letra F (float) o la letra D (double). 3.14 Valor de punto flotante 6.02E23 Valor de punto flotante muy grande 2.718F Valor sencillo de tipo float 123.4E+306D Valor de punto flotante muy grande de tipo double Tamaño Tipo 32 bits float 64 bits double En Java, todos los valores de punto flotante son double, a menos que se indique explícitamente que sean float. Por lo tanto, en los ejemplos anteriores: 2.718F debe llevar la letra F para mantenerlo como float 123.4E+306D la D es redundante Modificadores Dentro de las palabras reservadas, Java utiliza las siguientes para modificar el acceso a una variable, clase o función y se colocan al inicio de la declaración: public, protected, default, private. El modificador public da acceso a cualquier objeto externo. public int numero; // cualquier objeto puede accesar a esta variable El modificador protected da acceso a objetos que son parte del mismo paquete, y las subclases. (Más adelante se explica el concepto de paquete) El modificador default da acceso a objetos que son parte del mismo paquete. Sin embargo, en los programas no se especifica el modificador porque no hay una palabra para ello. int numero; // acceso default El modificador private da acceso únicamente a la clase que lo contiene. private int numero; // únicamente lo puede accesar la clase Convenciones en la programación Clases.- Los nombres de las clases deberían ser sustantivos, utilizando mayúsculas para la primera letra y minúsculas para las restantes, y se pueden mezclar varios sustantivos. class CuentaBancaria Interfaces.- Los nombres de las interfaces deberían tener la primera letra mayúscula, como en los nombres de clase. interface Cuenta Métodos.- Los nombres de los métodos deberían ser verbos, todo el verbo en minúscula. Se pueden agregar sustantivos con la primera letra en mayúscula. Evitar el uso de subrayas. void revisarCuenta() Constantes.- Las constantes de tipos de datos primitivos deberían escribirse completamente en mayúsculas y separadas las palabras por subrayas. Las constantes de objeto pueden combinar mayúsculas y minúsculas final int MAX_CREDITO Variables.- Todas las variables deberían ser en minúsculas, y si se agregan palabras se separarán con una letra mayúscula. Evitar el uso del signo $. primerUsuario Las variables deben tener significado e indicar su uso. Las variables de una letra deberían evitarse, excepto las que suelen usarse en ciclos (x, y, i, j) para controlarlo. Otras convenciones de la programación incluyen el uso de llaves ({}) alrededor de un bloque de instrucciones, incluso cuando se trate de una sola instrucción, ya que esto ayuda en el mantenimiento del programa. if(condición) { bloque } El espaciado ayuda en la comprensión del programa. Se sugiere escribir una instrucción por línea y usar indentación de uno o dos espacios. Los comentarios también ayudan en la comprensión y mantenimiento del programa al dar una descripción clara de lo que hace cada función y el uso de las variables. Ejemplo: // primer programa en Java public class HelloWorld { public static void main(String argv[]) { System.out.println("Hello world!"; } } En detalle: // primer programa en Java La primera línea es un comentario. public class HelloWorld { Las siguientes dos líneas son la declaración de la clase, que al momento de ser compilado el programa, generará un archivo .class. Es importante que el nombre de la clase sea el mismo que el nombre del archivo: si la clase se va a llamar HelloWorld, el archivo se debe llamar HelloWorld.java. public static void main(String argv[]) { En las siguientes dos líneas se declara el inicio del programa. Para que el intérprete de Java pueda ejecutar el programa debe tener la misma sintaxis (excepto para el nombre del parámetro de main). Se declara public para que lo pueda accesar el intérprete de Java. Se declara static porque no se ha creado algún objeto y no se crea una instancia. Se declara void porque no se regresa valor alguno. En este ejemplo no se va a esperar parámetros de la línea de comandos. En argv[] se guardan los parámetros y la primera posición contiene el primer parámetro, no el nombre del programa: argv[0] parametro1 argv[1] parametro2 System.out.println("Hello world!"; La siguiente línea muestra el uso de una clase y un método que imprime en la salida estándar (la pantalla) un mensaje. } } Finalmente se termina el bloque del método main y la declaración de la clase. Una vez que se tiene el código fuente en el archivo HelloWorld.java se usa el compilador de Java de la siguiente manera: javac HelloWorld.java Si el compilador no regresa mensajes de error, se habrá creado un nuevo archivo HelloWorld.class en el mismo directorio que el código fuente. Después de la compilación, se puede ejecutar el programa y ver el resultado usando el intérprete de Java: java HelloWorld Modifica el programa anterior para dejar errores y ver lo que presenta el compilador. Modificar el programa de “HelloWorld.java” para que reciba un nombre por medio de un parámetro en la línea de comandos y que lo imprima en forma de saludo. Por ejemplo: C:>java Hello JoseLuis Esto deberá desplegar una salida: Gusto en conocerte JoseLuis *Nota: Recuerde que los parámetros que son recibidos en la línea de comandos se guardan en el arreglo de tipo String (comúnmente llamada argv[ ] ) del método main. Trate de utilizar la propiedad “length” del ya mencionado arreglo para controlar el número de parámetros recibidos. Ver Cap1Hello.java Inicialización de variables Java no permite que una variable tenga un valor indefinido. Cuando un objeto es creado, sus variables son inicializadas con los siguientes valores: byte 0 short 0 int 0 long 0L float 0.0F double 0.0D char 'u0000' (NULO) boolean false todas las referencias null Si algún objeto hace referencia a algo con valor de null, creará una excepción (un error que es manejable) . Para evitar que las variables tengan valores indeseables, se debe asignárseles algún valor útil. El compilador estudia el código para determinar que cada variable ha sido inicializada antes de su primer uso. Si el compilador no puede determinar esto, entonces ocurre un error en tiempo de compilación. public void calcula() { int x = (int)(Math.random() * 100); int y; int z; if(x > 50) { y = 9; } z = y + x; // el posible uso antes de la inicialización de y creara un error de compilación } Expresiones lógicas Los operadores relacionales y lógicos regresan un valor boolean. En Java no existe conversión automática de int a boolean, como en C++. int i = 1; if(i) // error en tiempo de compilación if(i != 0) // correcto Los operadores en Java son muy similares en estilo y función a aquellos en C y C++. La siguiente tabla enlista los operadores por orden de precedencia: Separador . [] () ; , D a I ++ -- + - ~ ! I a D * / % I a D + - I a D << >> I a D < > <= >= instanceof I a D == != I a D & I a D ^ I a D | I a D && I a D || D a I ?: D a I = *= /= %= += -= <<= >>= &= ^= |= El operador + se puede utilizar para concatenar cadenas de caracteres, produciendo una nueva: String saludo = "Sr. "; String nombre = "Luis " + "Torres"; String persona = saludo + nombre; Los operadores && (and) y || (or) realizan una evaluación corta en expresiones lógicas. Por ejemplo: String unset = null; if((unset != null) && (unset.length() > 5)) { // hacer algo con unset } La expresión que forma a if() es legal y completamente segura. Esto es porque la primera subexpresión es falsa, y es suficiente para probar que toda la expresión es falsa. El operador && omite la evaluación de la segunda subexpresión y una excepción de null pointer es evitada. De forma similar, si se usa el operador || y la primera subexpresión es verdadera, la segunda subexpresión no es evaluada porque toda la expresión es verdadera. Cast Cuando la asignación de valores no es compatible por los tipos de datos, se usa un cast para persuadir al compilador de reconocer tal asignación. Esto se puede hacer para asignar un long a un int, por ejemplo. long bigValue = 99L; int smallValue = (int)(bigValue); No es necesario el segundo grupo de paréntesis, los que encierran a bigValue, pero es muy recomendable dejarlos. Aunque short y char ocupan 16 bits, se debe hacer un cast explícito, debido al rango que tienen asignado. Permite elegir una de dos opciones. La sintaxis básica de la sentencia if/else es: if(condición) { instrucción_o_bloque ; } else { instrucción_o_bloque ; } Ejemplo: int aleatorio = (int)(Math.random() * 100); if(aleatorio < 50) { System.out.println("menor a 50"; } else { System.out.println("mayor o igual a 50"; } Sentencia switch. Permite seleccionar una de varias opciones. La sintaxis para switch es la siguiente: switch(expresión_a_evaluar) { case valor1: instrucciones; break; case valor2: instrucciones; break; case valor3: instrucciones; break; default: instrucciones; break; } El valor de expresion_a_evaluar debe ser compatible con el tipo int, como short, byte y char. No se permite evaluar long o valores de punto flotante. Ejemplo: Int colorNum = 1; switch(colorNum) { case 0: setBackground(Color.red); break; case 1: setBackground(Color.green); break; case 2: setBackground(Color.blue); break; default: setBackground(Color.black); break; } La sentencia for. Permite realizar una serie de instrucciones mientras se cumple una condición. La sintaxis básica para for es: for(inicialización;condición;alteración) { instrucciones; } Ejemplo: int x; for(x = 0;x < 10;x++) { System.out.println("dentro de for"; } System.out.println("fin de for"; El tercer parámetro puede ser tanto de incremento como de decremento, y no únicamente de uno en uno. Java permite el uso de comas dentro de la declaración de for, como en C, por lo que lo siguiente es legal: for(i = 0, j = 0;j < 10;i++,j++) En el ejemplo anterior, la variable x es "visible" en el método en el que es declarada. Se puede usar una variable que sea visible únicamente para el ciclo for: for(int x=0;x<10;x++) { ... } // una vez terminado el ciclo, x ya no puede ser accesada La sentencia while. Permite realizar una serie de instrucciones mientras se cumple una condición. La sintaxis básica de while es: while(condición) { instrucciones; } Ejemplo: int i = 0; while(i<15) { System.out.println("dentro de while"; i+=2; } La sentencia do/while. Permite realizar una serie de instrucciones hasta que deje de cumplirse una condición. La sintaxis básica de la sentencia es: do { instrucciones; }while(condición); Ejemplo: int i = 0; do { System.out.println("dentro de while"; i++; }while(i<10);

0
7
L
limpiar ubuntu
LinuxporAnónimo5/18/2011

Antes de empezar mi post he visto un comando que casi en ninguno de los post he encontrado y que siempre me solicitan... o me preguntan de aqui surge la necesidad de mostrarle el comando que es para ingresar directamente para la ejecuciòn de cualquier comando en linux: Ctrl+ F2 sudo apt-get autoclean ( limpia ubuntu de archivos innecesarios) sudo apt-get autoremove ( limpia los paquetes, huerfanos, innecesarios o con errores) sudo apt-get update ( actualiza y busca nuevas versiones de los paquetes instalados) sudo rm nobre-del-archivo-a-borrar ( Borra un fichero) sudo rmdir nombre-del-directorio-a-borrar ( Borra directorio vacio) sudo rm -rf nombre-del-directorio-con_archivos-a-borrar ( CUIDADO, borra sin pedir sudo rm -R directorio: Borra el contenido completo (ficheros/subdirectorios) de directorio confirmación) estos comandos son netamente un mantenimiento a su querido sistema operativo Linux

50
0
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.