0% encontró este documento útil (0 votos)
118 vistas85 páginas

Segunda Parte PHP

El documento introduce PHP como un lenguaje rápido e interpretado para el desarrollo de aplicaciones web. Explica que PHP se ejecuta en el servidor, generando páginas HTML dinámicas según la lógica del código PHP. También cubre cómo incrustar código PHP en archivos HTML usando etiquetas, incluir archivos PHP externos, y los tipos de datos soportados como números, cadenas, arrays y objetos.

Cargado por

Rudy Alf Poma
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
118 vistas85 páginas

Segunda Parte PHP

El documento introduce PHP como un lenguaje rápido e interpretado para el desarrollo de aplicaciones web. Explica que PHP se ejecuta en el servidor, generando páginas HTML dinámicas según la lógica del código PHP. También cubre cómo incrustar código PHP en archivos HTML usando etiquetas, incluir archivos PHP externos, y los tipos de datos soportados como números, cadenas, arrays y objetos.

Cargado por

Rudy Alf Poma
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 85

2.

1 introduccion a php

PHP es un lenguaje rápido pese a ser interpretado, multiplataforma y dispone de una


gran cantidad de bibliotecas para el desarrollo de aplicaciones Web.

Está basado en herramientas de software libre (Apache, MySQL, etc.), es decir, no hay
que pagarlas; además proporciona los mecanismos para poder trabajar con casi
cualquier base de datos (sea software libre o no) y servidor web.

Cuando pedimos a nuestro servidor web una página PHP, que no es sino un programa
PHP que genera una página HTML, el servidor le pasa la página al interprete PHP y es
el resultado lo que se le envía al cliente.

El interprete de PHP permite ser compilado y utilizado como un CGI. De esta forma
cualquier servidor web que soporte CGI podría ejecutar páginas PHP. Nosotros en este
tutorial lo vamos a usar como un módulo de Apache, la ventaja es que obtenemos una
velocidad de ejecución bastante superior, asi como un consumo menor de recursos. En
el caso de tener PHP instalado como un módulo del servidor Apache, este hereda todas
las características del servidor.

PHP se contruyó para ser utilizado conjuntamente con la base de datos MySQL, pero
actualmente soporta la mayoría de bases de datos (Oracle, Informix, ODBC, SQl Server,
etc.). Nosotros utilizaremos MySQL, porque la interacción entre PHP y MySQL
funciona a la perfección y además es software libre.

Debido a que PHP has sido diseñado de forma modular y sencilla, hay multitud de
bibliotecas entre ellas destacamos el soporte para:

 Acceso de servidores IMAP y POP3


 Envío de correo con SMTP
 Acceso de servidores FTP
 Acceso a SNMP para gestión de redes y equipos
 HTTP a nivel de socket
 Generación dinámica de documentos PDF
 Análisis y procesamiento de documentos XML y XSLT
 Corrector de ortografía
 Expresiones regulares de Perl
 Utilización de clases Java o módulos .NET
 Creación de animaciones Flash usando PHP

2.2 formas incrustar php en html

Los scripts PHP los puedes colocar en cualquier parte de tu código HTML siempre entre
los marcadores <?php ?> . Para incluir un archivo php en un fichero aparte del html
puedes usar:

include("nombreFichero.php");
require("nombreFichero.php");
include_once("nombreFichero.php");
require_once("nombreFichero.php");
Un ejemplo seria.

Fichero PHP: saludo.php


 
000 
001  <?php
002     echo "HOLA MUNDO";
003  ?>
004 
Seleccionar  PHP
 

Fichero HTML: index.html


 
000 
001  <html>
002  <head><title></title></head>
003  <body>
004   
005  <?php
006   
007  include("saludo.php");
008   
009  ?>
010  </body>
011  </html>
012   
013 

 2.2.1 elementos del lenguaje php

Está escrito tanto para usuarios que trabajen con PHP para programadores que
habitualmente lo hacen. Es apropiado para todos aquellos que confíen en el lenguaje
PHP a la hora de construir un sitio Web con contenido dinámico, algo que está más allá
de las capacidades del HTML puro ya que las aplicaciones son mas factibles.

PHP conocido como una tecnología de código abierto que resulta muy útil para diseñar
de forma rápida y eficaz aplicaciones Web dirigidas a bases de datos. PHP es un potente
lenguaje de secuencia de comandos diseñado específicamente para permitir a los
programadores crear aplicaciones en Web con distintas prestaciones de forma rápida.
MySQL es una base de datos rápida y fiable que se integra a la perfección con PHP y
que resulta muy adecuada para aplicaciones dinámicas basadas en Internet.

Como todo lenguaje de programación, PHP puede trabajar con una serie de tipos de
datos básicos. En concreto los tipos de datos admitidos son:
-       Números enteros: los enteros pueden ser dados tanto en base decimal como en
base octal o hexadecimal ( un 0 inicial indica que el valor esta representado en octal, un
0x indica que es hexadecimal.
- Ejemplos de números en base 10 : 45     -142       783
- Ejemplos de numero en octal:   0123 (equivale a 83)
- Ejemplos de números en hexadecimal: 0×12 (equivale a 18)

-       Números reales: Los números reales se pueden dar en dos formatos; como parte
entera y parte decimal, usando el punto como separador, o en notación científica.
Ejemplos: 14.67    -76.0023     1.4e3    -78.5e-4

-       Cadenas de Caracteres: Las cadenas de caracteres pueden ser dadas en dos
formatos usando comillas dobles o usando comillas simples. El uso de una u otra forma
de delimitación afecta a la forma en la que se tratan las posibles variables que puedan
haber dentro de la propia cadena.
Ejemplo: “Casablanca”, ‘cantando bajo la lluvia’

-       Arrays o Matrices: Constituyen colecciones de datos que se referencian bajo un


mismo nombre común. Como se verá al capítulo dedicado a estas estructuras de datos,
PHP admite la posibilidad de construir dos tipos de arrays: arrays asociativos e
indexados.

-       Objetos: finalmente PHP admite también la posibilidad de crear objetos y realizar
acción con ellos. Mediante el uso de objetos se puede entender como una misma entidad
los datos y las acciones que se realizan con ellos. Esta es la base de la programación
orientada a objetos.

2.2.2 php y formularios de html

PHP es un lenguaje de programación de uso general de código del lado del servidor
originalmente diseñado para el desarrollo web de contenido dinámico. Fue uno de los
primeros lenguajes de programación del lado del servidor que se podían incorporar
directamente en el documento HTML en lugar de llamar a un archivo externo que
procese los datos. El código es interpretado por un servidor web con un módulo de
procesador de PHP que genera la página Web resultante. PHP ha evolucionado por lo
que ahora incluye también una interfaz de línea de comandos que puede ser usada en
aplicaciones gráficas independientes. Puede ser usado en la mayoría de los servidores
web al igual que en casi todos los sistemas operativos y plataformas sin ningún costo.

Fue creado originalmente por Rasmus Lerdorf en 1995. Actualmente el lenguaje sigue
siendo desarrollado con nuevas funciones por el grupo PHP.2 Este lenguaje forma parte
del software libre publicado bajo la licencia PHP, que es incompatible con la Licencia
Pública General de GNU debido a las restricciones del uso del término PHP.

Continuando el artículo de introducción al HTML vamos a ampliar esa información en


este artículo centrándonos en la estructura básica de un formulario. Veamos con un
ejemplo como crear un formulario en HTML:

1 <form id="formulario" action="enviado.php" method="post">


2     <fieldset>
3         <legend>Formulario de Ejemplo</legend>
4             <label>Nombre</label>
5                 <input id="campo1" name="nombre" type="text" />
6             <label>Email</label>

7                 <input id="campo2" name="email" type="text" />


            <input id="campo3" name="enviar" type="submit"
8
value="Enviar" />
9     </fieldset>
10 </form>

a. Etiqueta form.

Esta etiqueta es la que define dentro de nuestra estructura HTML el inicio de un


formulario y está compuesta por:

 id: indica un nombre del formulario para que pueda ser personalizado mediante
CSS.
 action: define el destino a donde irán los datos del formulario en HTML. En
nuestro ejemplo el destino será un archivo llamado “enviado.php”.
 method: indica la forma en la que será enviado el formulario en HTML.

b. Etiqueta fieldset.

Esta etiqueta es de uso opcional y se utiliza para agrupar elementos en común dentro de
un mismo formulario en HTML. Se suele utilizar junto a la etiqueta legend que le da
un título al conjuntos de elementos definidos en el fieldset.

c. Etiqueta label.

Esta etiqueta se utiliza para definir el nombre visible de cada uno de los campos del
formulario en HTML.

d. Etiqueta input.

Esta etiqueta corresponde a los campos del formulario que necesitamos para su
funcionamiento. Esta está definida por:

 id: indica un nombre único del campo para que pueda ser personalizado
mediante CSS.
 name: indica el nombre único del campo en el formulario en HTML y este
nombre es el que nos permitirá realizar el envío de los datos de cada campo.
 type: indica el tipo de campo y la acción que tendrá dentro del formulario en
HTML. Existen varios tipos de campos input en un formulario:
o text: para agregar una cadena de caracteres ya sean letras o números.

o hidden: indica que será un campo oculto para el envío de datos que no
será visible para el usuario.
o password: se utiliza para los formularios de registro y los caracteres
escritos serán mostrados en forma de asteriscos o puntos.
o checkbox: casillas de verificación.

o radio: botones de opción.

o submit: este type se le asigna a un campo input para realizar el envío del
formulario en HTML. También existe el type reset que es para borrar
todos los campos del formulario si no se desea realizar el envío.

e. Otras etiquetas.

Además de las etiquetas anteriormente mencionadas para nuestro ejemplo existen otras
etiquetas que se usan frecuentemente en los formularios. Los más comunes son:

 select: este campo se configura con varias opciones para ser seleccionadas de
una lista.
 textarea: este campo es utilizado para escribir comentarios largos como el que
utiliza WordPress en sus artículos.

Ahora vamos a crear un archivo nuevo y lo vamos a llamar “formulario.html” y lo guardaremos


en la raíz de nuestro servidor con el siguiente código:

1 <html>
2 <head>
3 <title>Formulario de Ejemplo</title>
4 </head>

5  
6 <body>
7 <form id="formulario" action="enviado.php" method="post">
8     <fieldset>
9         <legend>Formulario de Ejemplo</legend>
10             <label>Nombre</label>
11                 <input id="campo1" name="nombre" type="text" />
12             <label>Email</label>

13                 <input id="campo2" name="email" type="text" />


            <input id="campo3" name="enviar" type="submit"
14
value="Enviar" />
15     </fieldset>
16 </form>
17 </body>
18 </html>
Si aún no dispones de un servidor para realizar estas pruebas puedes instalar un servidor
local en tu ordenador para que puedas ir trabajando. Puedes leer el artículo de cómo
instalar un servidor local el cual te ayudará a realizar tus prácticas sin tener que pagar.

Estilos CSS para un formulario en HTML.


Si ya tienes algo de conocimientos en CSS lo que viene ahora te será fácil de entender.
Si no te invito a que leas antes el artículo hojas de estilo en cascada para que puedas
comprender este apartado.

Continuando con nuestro formulario de ejemplo, vamos a personalizarlo un poco creando un


archivo CSS utilizando el método externo. Comencemos a construir nuestro archivo:

1 label { font-weight: bold; color: #444; font-size: 14px; }


2 input { font-size: 14px; }
input[type="text"] { margin: 10px 0; background: #fff; border: 1px
3 solid #ccc; color: #777; display: block; max-width: 100%; outline:
none; padding: 7px 8px; }
input[type="submit"] { margin: 10px 0; background: #0088B2; color:
4 #fff; padding: 8px 14px; font-weight: bold; display: inline-block;
border: none; cursor: pointer; }
5 input[type="submit"]:hover { background: #444; }

Vamos a crear un archivo nuevo y lo guardamos como “formulario.css” en la raíz de nuestro


servidor. Ahora nos dirigimos a nuestro archivo “formulario.html” y agregamos la siguiente
línea de código entre las etiquetas head:

<link rel="stylesheet" type="text/css" href="formulario.css"


1
media="all" />

quedándonos así:

1 <html>
2 <head>
3 <title>Formulario de Ejemplo</title>
<link rel="stylesheet" type="text/css" href="formulario.css"
4
media="all" />
5 </head>
6  
7 <body>
8 <form id="formulario" action="enviado.php" method="post">
9     <fieldset>
10         <legend>Formulario de Ejemplo</legend>
11             <label>Nombre</label>
12                 <input id="campo1" name="nombre" type="text" />
13             <label>Email</label>
14                 <input id="campo2" name="email" type="text" />
            <input id="campo3" name="enviar" type="submit"
15
value="Enviar" />
16     </fieldset>
17 </form>
18 </body>
19 </html>

Aplicando programación dinámica al formulario en


HTML.
Siguiendo con nuestro ejemplo vamos a crear un archivo llamado “enviado.php” en el cual
escribiremos el siguiente código:

1 <?php
2 if($_POST["nombre"] && $_POST["email"] != ""){
3     $de = $_POST["nombre"];
4     $destino = "tuemail";
5     $asunto = "FORMULARIO DE EJEMPLO";
6     $mensaje .= "FORMULARIO."."\n";

7     $mensaje .= "\n";
8     $mensaje .= "NOMBRE: " . utf8_decode($_POST["nombre"]) ."\n";
9     $mensaje .= "\n";
    $mensaje .= "EMAIL: " .
10
utf8_decode($_POST["email"]) ."\n";
11     $emailheader = "From: LO QUE TU QUIERAS <tuemail>\r\n";
mail($destino, $asunto, $mensaje, $emailheader) or die ("Lo
12 sentimos, tu solicitud no ha sido enviada.<br/>Intentelo de
nuevo.");
echo utf8_decode(utf8_encode('Tu consulta ha sido enviada
13
correctamente.'));
14     } else {

15     if($_POST["nombre"] == ""){
16     echo utf8_encode ('Por favor, indica tu nombre.');
17     exit; }
18     if($_POST["email"] == ""){
19     echo utf8_encode ('Por favor, indica un email de contacto.');
20     exit; }

21 }
22 ?>

Se puede observar que se ha llamado a este archivo “enviado.php” ya que es el que


hemos declarado en nuestro formulario en HTML en la línea:
<form id="formulario" action="enviado.php" method="post"
1
enctype="text/plain">

y este será el archivo encargado de recibir los datos y enviarlos a un correo electrónico.

La programación en PHP para este formulario ha sido diseñada para que tanto el campo
“Nombre” como el campo “Email” sean obligatorios por lo que al intentar enviar el
formulario en HTML sino se rellenan estos campos aparecerá un mensaje donde
indica que deben rellenarlos y no se enviará.

También se puede observar que en el código HTML de “formulario.html” hemos


asignado como nombres de los input nombre y email y en el código PHP los hemos
escrito exactamente igual ya que tienen que coincidir para que se pueda enviar en
formulario con los datos introducidos.

En el código PHP hay una línea, $destino = “tuemail”; donde debes sustituir tuemail por
el email al que quieres que te llegue el formulario. Hay otra línea, $emailheader =
“From: LO QUE TU QUIERAS \r\n”;, donde debes cambiar LO QUE TU QUIERAS
por un nombre cualquiera que se relacione con tu formulario y tuemail por el mismo
email al que quieres que te llegue el formulario.

Algo que quisiera aclarar es que la creación de formularios en WordPress


normalmente se puede realizar mediante plugins que ahorran mucho el trabajo pero la
desventaja que tiene el instalar plugins en WordPress es que se agregan más líneas de
código a la página y más archivos en el servidor por lo que a la larga la página web te
irá más lenta.

En este artículo hemos visto mediante 3 sencillos archivos como crear un formulario
en HTML, como personalizarlo y una parte de programación para su envío. También se
pueden utilizar otras tecnologías de programación como ASP para el envío de datos
mediante un formulario. Queda de parte del lector investigar un poco más si desea
profundizar más en la creación de formularios en HTML.

2.2.3 METODOS DE TRANSFERENCIA DE DATOS EN FORMULARIOS

los datos que el usuario introduzca en un formulario de una pagina web puede ser
transferidos al servidor para su procesamiento con dos metodos diferentes :

-metodo get: los datos son rmviados dentro de l url de localización del destino .

-metodos post: los datos son enviados de manera “invisible” para el usuario,
haciendo uso del protocolo http y en un encabezado in dependien te.

El método de tranferencia se especifica en la definición del formulario mediante el


parámetro METHOD, asignándole el valor “GET” o “POST” en función del método
elegido .En caso de ausencia de ese parámetro , se con sidera como métodos por
defecto el método GET.

En el caso de que los datos deban ser transferidos por correo eléctrico , es
obligatorio el uso del método POST.
2.2.4. Transferencia de datos al script desde el url

Hay dos métodos para pasar variables de una página a otra: utilizando un formulario o
mediante la URL. Cada uno tiene una manera de recuperar los datos en la página de
destino, el primero mediante el uso de la variable global $_POST, el segundo mediente
$_GET.

Utilizaremos el primer método cuando tengamos que usar un formulario para que el
usuario introduzca algún valor, como por ejemplo en un formulario de búsqueda o en
uno de contacto que permita enviar un mensaje. Utilizaremos el segundo cuando sean
variables que no dependan en absoluto de la interacción del usuario, sino que
sencillamente queramos transferir de una página a otra.

Paso de variables mediante formulario y $_POST

En la página de origen construiremos un formulario. Transferiremos a la página de


destino las variables deseadas mediante la marca input de tipo hidden, con el
atributo name las definiremos, y con el atributo value les asignaremos un valor.

1 <form action="http://url.pagina.destino" method="post">


2  <input type="hidden" name="variable1" value="valor1" />
3  <input type="hidden" name="variable2" value="valor2" />
4  <input type="text" value="" />
5  <input type="submit" value="Buscar" />
6 </form>

Para recuperar las variables en la página dedestino bastará utilizar la variable global $_POST:

1 <?php
2 $v1 = $_POST['variable1'];
3 $v2 = $_POST['variable2'];
4 ?>

Paso de variables mediante URL y $_GET

En la página de origen construiremos un enlace a la página de destino que incluya las variables
a transferir, de la siguiente manera:

<a href="http://url.pagina.destino/?
1
variable1=valor1&variable2=valor2">Enlace a página de destino</a>

Para recuperar las variables en la página dedestino bastará utilizar la variable global $_GET:

1 <?php
2 $v1 = $_GET['variable1'];
3 $v2 = $_GET['variable2'];
4 ?>

2.2.5 cookies

Una cookie (o galleta informática) es una pequeña información enviada por un sitio
web y almacenada en el navegador del usuario, de manera que el sitio web puede
consultar la actividad previa del usuario.

Sus principales funciones son:

 Llevar el control de usuarios: cuando un usuario introduce su nombre de usuario


y contraseña, se almacena una cookie para que no tenga que estar
introduciéndolas para cada página del servidor. Sin embargo, una cookie no
identifica solo a una persona, sino a una combinación de computador-
navegador-usuario.
 Conseguir información sobre los hábitos de navegación del usuario, e intentos
de spyware (programas espía), por parte de agencias de publicidad y otros. Esto
puede causar problemas de privacidad y es una de las razones por la que las
cookies tienen sus detractores.

Originalmente, sólo podían ser almacenadas por petición de un CGI desde el servidor,
pero Netscape dio a su lenguaje Javascript la capacidad de introducirlas directamente
desde el cliente, sin necesidad de CGIs. En un principio, debido a errores del navegador,
esto dio algunos problemas de seguridad. Las cookies pueden ser borradas, aceptadas o
bloqueadas según desee, para esto sólo debe configurar convenientemente el navegador
web.

Las cookies son utilizadas habitualmente por los servidores web para diferenciar
usuarios y para actuar de diferente forma dependiendo de éstos. Las cookies se
inventaron para ser utilizadas en una cesta de la compra virtual, que actúa como
dispositivo virtual en el que el usuario va "colocando" los elementos que desea adquirir,
de forma que los usuarios pueden navegar por el sitio donde se muestran los objetos a la
venta y añadirlos y eliminarlos de la cesta de la compra en cualquier momento. Las
cookies permiten que el contenido de la cesta de la compra dependa de las acciones del
usuario.

Un uso de las cookies es identificarse en un sitio web. Los usuarios normalmente se


identifican introduciendo sus credenciales en una página de validación; las cookies
permiten al servidor saber que el usuario ya está validado, y por lo tanto se le puede
permitir acceder a servicios o realizar operaciones que están restringidas a usuarios no
identificados.

Otros sitios web utilizan las cookies para personalizar su aspecto según las preferencias
del usuario. Los sitios que requieren identificación a menudo ofrecen esta característica,
aunque también está presente en otros que no la requieren. La personalización incluye
tanto presentación como funcionalidad. Por ejemplo, las páginas de Wikipedia permiten
a los usuarios identificados elegir un estilo de presentación a su gusto; el motor de
búsqueda de Google permite a los usuarios (incluso a los no registrados) decidir cuántos
resultados de búsqueda quieren ver en cada página.

Las Cookies se utilizan también para realizar seguimientos de usuarios a lo largo de un


sitio web. Las cookies de terceros y los errores en servidores web que se explican más
abajo también permiten el seguimiento entre diferentes sitios. El seguimiento en un
mismo sitio normalmente se hace con la intención de mantener estadísticas de uso,
mientras que el seguimiento entre sitios normalmente se orienta a la creación de perfiles
de usuarios anónimos por parte de las compañías de publicidad, que luego se usarán
para orientar campañas publicitarias (decidir qué tipo de publicidad utilizar) basadas en
perfiles de usuarios.

2.2.6 manejo de archivos

Una de las principales funciones de un Sistema Operativo es la administración


del almacenamiento de información, para lo cual es necesario contar con un
“Sistema de Archivos”. Con este término se hace referencia, por un lado, a los
mecanismos y estructuras que el sistema operativo utiliza para organizar la
información en medios físicos tales como discos y diskettes (aspecto físico del
sistema de archivos), y por otro a la visión que es ofrecida al usuario para
permitir la manipulación de la información almacenada (una abstracción, o
perspectiva lógica del sistema de archivos).

Se ofrece a continuación una descripción sintética de los aspectos lógicos del


sistema de archivos de Linux.

ARCHIVOS Y DIRECTORIOS

El sistema de archivos de Linux está organizado en archivos y directorios. Un


archivo es una colección de datos que se almacena en un medio físico y a la
cual se le asigna un nombre. Los archivos, a su vez, están agrupados en
conjuntos llamados directorios. Un directorio puede tener subdirectorios,
formándose así una estructura jerárquica con la forma de un árbol invertido. El
directorio inicial de esa jerarquía se denomina directorio raíz y se simboliza con
una barra de división (/).

El sistema de archivos de un sistema Linux típico está formado por los


siguientes directorios bajo el directorio raíz:
/bin Contiene los programas ejecutables que son parte del sistema operativo
Linux. Muchos comandos de Linux como cat, cp, ls, more y tar están ubicados
en este directorio.

/boot Contienen el kernel (o núcleo) de Linux y otros archivos necesarios para


el administrador de inicio LILO, que realiza la carga inicial del sistema operativo
cuando la computadora se enciende.

/dev Contienen todos los archivos de acceso a dispositivos. Linux trata cada
dispositivo (terminales, discos, impresoras, etc.) como si fuera un archivo
especial.

/etc. Contiene archivos de configuración del sistema y los programas de


inicialización.

/home Contiene los directorios HOME de los usuarios. El directorio HOME el


directorio inicial en el que se encuentra posicionado un usuario al ingresar al
sistema, por lo que también se conoce como directorio de logín o de conexión.

/lib Contiene los archivos de biblioteca utilizados por las aplicaciones y


utilidades del sistema, así también como las librerías pertenecientes a
diferentes lenguajes de programación.

/lost+found Directorio para archivos recuperados por el proceso de reparación


del sistema de archivos, que se ejecuta luego de una caída del sistema y
asegura su integridad luego de que el equipo haya sido apagado de manera
inapropiada.

/mnt Es un directorio vacío que se usa normalmente para montar dispositivos


como disquetes y particiones temporales de disco.
/proc Contiene archivos con información sobre el estado de ejecución del
sistema operativo y de los procesos.

/root Es el directorio HOME para el usuario root (administrador del sistema).

/sbin Contienen archivos ejecutables que son comandos que se usan


normalmente para la administración del sistema.

/tmp Directorio temporal que puede usar cualquier usuario como directorio
transitorio.

/usr Contiene archivos de programa, de datos y de librerías asociados con las


actividades de los usuarios.

/var Contiene archivos temporales y de trabajo generados por programas del


sistema. A diferencia de /tmp, los usuarios comunes no tienen permiso para
utilizar los subdirectorios que contiene directamente, sino que deben hacerlo a
través de aplicaciones y utilidades del sistema.

2.3 el sistema en manejo de base de datos

2.3.1. utilización de MySQL

es un sistema de administración de bases de datos


relacionales rápido, sólido y flexible. Es ideal para crear
bases de datos con acceso desde páginas web dinámicas, para
creación de sistemas de transacciones on –line o para
cualquier otra solución profesional que implique almacenar
datos, teniendo la posibilidad de realizar múltiples y
rápidas consultas.
Mysql ofrece varias ventajas respecto a otros sistemas
gestores de bases de datos:
-Tiene licencia publica, permitiendo no solo la utilización
del programa sino también la consulta y modificación de su
código fuente. Resulta por tanto fácil de personalizas y
adaptar a las necesidades concretas.
-El programa esta desarrollado en C y C++, lo que facilita
su integración en oteas aplicaciones desarrolladas
igualmente en esos lenguajes.
-Puede ser descargado gratuitamente de Internet
(http://www.mysql.com)haciendo uso de su licencia GPL.
Este libro pretende introducirnos en el conocimiento de una
tecnología web de uso sencillo y que está al alcance de
cualquier tipo de empresas, sin importar su tamaño,
mediante el uso conjunto del lenguaje PHP y gestor de base
de datos MySQL de forma conjunta. Y todo esto porque para
su uso no es necesario contar con personal con profundos
conocimientos técnicos. La intención de los autores ha sido
escribir un libro de fácil lectura e interpretación para
personas con conocimientos muy básicos de lenguajes de
programación y con inquietudes por el desarrollo de sitios
web. INDICE: Internet y la programación de ordenadores.
Open Source y Software libre. Creación de páginas web
mediante el lenguaje HTML. Introducción a PHP. PHP y los
formularios de HTML. Sentencias de control. Definición de
funciones. Arrays. Funciones predefinidas. Programación
orientada a objetos. Cookies. Base de datos relacionales y
el lenguaje SQL. El sistema gestor de base de datos MySQL.
Funciones Open Source basadas en PHP y MySQL.

3.3.15 comandos y lectores de datos

Puede utilizar un comando de datos para ejecutar un procedimiento de base de datos que
devuelva un conjunto de resultados de sólo lectura; es decir, puede ejecutar una
instrucción SQL Select o un procedimiento almacenado que contenga una instrucción
Select. Es similar a lo que sucede cuando rellena un conjunto de datos con un adaptador
de datos, excepto que el conjunto de resultados se le devuelve directamente.

Si no tiene otras razones para utilizar un conjunto de datos (por ejemplo, desea
compartir los datos con otro componente o aplicación), puede ser más rápido utilizar un
comando de datos para obtener un conjunto de resultados directamente en vez de
cargarlos en el conjunto de datos. Para obtener más información acerca de las ventajas
relativas de los conjuntos de datos con respecto a los comandos de datos, vea
Recomendaciones sobre la estrategia de acceso a datos.

Con un comando de datos puede devolver cero o más registros. Por tanto, podría utilizar
un comando de datos para realizar las siguientes acciones:

 Devolver un conjunto de registros que se va a rellenar en un control de un


formulario. Esto es especialmente útil en páginas de formularios Web Forms,
donde con frecuencia se crean listas de sólo lectura (como resultado de
búsquedas o listas de inventarios).
 Para devolver un único registro, que se localiza exactamente pasando parámetros
al comando que identifica el registro por Id. u otro valor único. Podría pasar un
Id. a un comando para devolver un registro correspondiente, o rellenar un
registro sencillo en una vista de datos para poder enlazar un conjunto de
controles de formulario a la vista de datos.
 Para ejecutar un comando que devuelva información de catálogo de una base de
datos.

Los conjuntos de resultados se devuelven mediante un lector de datos (un objeto del tipo
OleDbDataReader, SqlDataReader, OdbcDataReader o OracleDataReader). A
continuación, puede recorrer este objeto, para extraer registros individuales del conjunto
de resultados. Ya que el lector de datos proporciona acceso a los datos sólo hacia
delante y de sólo lectura, es muy rápido.

Para ejecutar un comando que devuelve un conjunto de resultados

1. Agregue un comando de datos al formulario o componente Para obtener más


información, vea Agregar comandos de datos a un formulario o un componente.
2. Establezca la propiedad CommandText del objeto de comando de datos en una
instrucción SQL o en el nombre de un procedimiento almacenado que devuelva
un conjunto de resultados.
3. Establezca la propiedad CommandType en CommandType.Text (para una
instrucción) o en CommandType.StoredProcedure (para un procedimiento
almacenado). Estos valores se definen en la enumeración CommandType.
4. Si el comando acepta parámetros, establézcalos. Para obtener más información,
vea Establecer y obtener parámetros de comandos de datos.
5. Cree un objeto lector de datos como una instancia de la clase OleDbDataReader,
SqlDataReader, OdbcDataReader o OracleDataReader.
6. Abra la conexión asociada con el comando de datos.
7. Llame al método ExecuteReader del comando, estableciendo el resultado en el
lector de datos que ha creado en el paso 5.

Sugerencia   El método ExecuteReader le permite pasar un parámetro que


especifique el comportamiento del comando, incluidas las opciones para cerrar
la conexión inmediatamente, devolver sólo un único registro y devolver sólo
claves. Para obtener más información, vea OleDbCommand.ExecuteReader
(Método, CommandBehavior), SqlCommand.ExecuteReader (Método,
CommandBehavior), OdbcCommand.ExecuteReader (Método,
CommandBehavior) u OracleCommand.ExecuteReader (Método,
CommandBehavior).

8. Recorra el lector de datos mediante su método Read hasta que el método


devuelva False.
9. Cierre el lector.
10. Si aún no lo ha hecho en la ejecución del método ExecuteReader, cierre la
conexión.
El siguiente ejemplo muestra cómo leer los registros de la tabla Authors de la base de
datos Pubs de SQL Server. El ejemplo utiliza el tipo de comando de TableDirect y
especifica el nombre de la tabla Authors como el texto del comando. Las dos
configuraciones pueden realizarse en la ventana Propiedades, pero se muestran aquí dar
una visión completa. Cuando se llama al método ExecuteReader, el ejemplo recorre el
lector de datos y genera una cadena delimitada con la información del autor que se
muestra en un cuadro de texto.

Nota   En el ejemplo, la información de columna se extrae haciendo referencia al


nombre de columna en el lector de datos. Puede optimizar el acceso utilizando más
eficazmente las formas de obtener la información de columna. Para obtener más
información, vea Recuperar datos mediante DataReader.
3.4 conectividad a sql server ADO.NET

3.4.1. preparación y ejecución de consultas SQL

Los que acostumbramos a utilizar MySQL no estamos familiarizados con esta sintaxis
de preparar y ejecutar consultas que tiene el driver de Microsoft para PHP.

En este post intento mostrar cómo usar el driver de


SQL Server para PHP para ejecutar una
instrucción preparada varias veces. Esto es
mediante la combinación de sqlsrv_prepare y
sqlsrv_execute, y el resultado es una instrucción
que se compila una vez en el servidor y se puede ejecutar después varias veces con
distintos valores de parámetro. En el caso de consultas únicas, se recomienda el uso de
sqlsrv_query que es a lo que estamos acostumbrados en MySQL.

Al preparar una instrucción que usa variables como parámetros, las variables se enlazan
a la instrucción. Eso significa que si se actualizan los valores de las variables, la
próxima vez que se ejecute la instrucción se ejecutará con los valores de parámetros
actualizados.

En el siguiente enlace tenemos un ejemplo de cómo utilizar estas funciones para


ejecutar una consulta varias veces pero solo prepararla una vez (la función sqlsrv_query
realiza estas dos acciones cada vez que es llamada)

Otra curiosidad fundamental de SQL Server es llamar desde PHP a un procedimiento


almacenado de SQL Server, para ello podemos utilizar la siguiente sintaxis:

$params = array($i, $s, $a);


$sql = "{call UpdateOrInsertSession(?,?,?)}";
$stmt = sqlsrv_query($this->_conn, $sql, $params);

4. ASP.NET AJAX

4.1 introduccion al ajax


SP.NET AJAX, anteriormente llamado Atlas, es un conjunto de extensiones para
ASP.NET desarrollado por Microsoft para implementar la funcionalidad de Ajax.

Mediante componentes del lado del cliente y del servidor, ASP.NET AJAX permite al
desarrollador crear aplicaciones web en ASP.NET 2.0 que pueden actualizar datos en la
página web sin un recarga completa de la misma. La tecnología clave que permite esta
funcionalidad es el objeto XMLHttpRequest, junto con Javascript y DHTML.

ASP.NET AJAX fue liberado en enero de 2007 después de un largo periodo de pruebas.
Fue subsecuentemente incluido con la versión 3.5 del .NET Framework, que fue
liberada junto con Visual Studio 2008 en noviembre de 2007.

4.2 el oljeto XMLHttpRequest

Lo prometido es deuda y hoy seguimos (o casi empezamos) con el estudio de las


aplicaciones AJAX.

Aparte de saber HTML y JavaScript, el primer objeto que debemos conocer para hacer
aplicaciones AJAX es XMLHttpRequest.

Si has utilizado alguna vez las bibliotecas MSXML con Visual Basic 6.0 o ASP 3.0 es
probable que ya lo conozcas. Aunque en el caso de Internet Explorer se sigue usando
este objeto ActiveX en el resto de los navegadores (Firefox, Opera, Safari...)  este objeto
forma parte ya de las clases nativas del navegador.

Su utilidad básica es la de enviar peticiones (tanto GET como POST) a Urls mediante el
protocolo HTTP.

Los métodos y propiedades básicos que debemos conocer son los siguientes(los
corchetes indican parámetros opcionales):

 open(metodo, URL, [asincrono], [usuario], [clave]): sirve para abrir una


conexión al servidor. No envía ni obtiene información, sólo se conecta. El tercer
parámetro es booleano y sirve para indicar si la conexión se realizará
asíncronamente o no (normalmente será que sí). Se puede especificar un nombre
de usuario y una contraseña de accesopero normalmente esto será absurdo
(estará en claro en el JavaScript, ya me dirás de qué sirve entonces).
 send(contenido): envía una petición. Si es un POST se pueden incluir los datos a
enviar en el parámetro, si no se usa un nulo.
 abort(): cancela un envío/petición.
 onreadystatechange: se le asigna un método que será llamado automáticamente
cuando se descargue de todo la URL remota (cuando se llama asíncronamente).
 readyState: informa del estado de la petición: 0=no iniciada, 1=cargando,
2=terminada pero sin procesar, 4=completada.
 status: código de estado HTTP: por ejemplo 200 (éxito), 404 (no encontrado),
etc...
 statusText: mensaje de información del estado anterior.
 responseXML: documento DOM que representa el XML devuelto por la
petición (se espera XML, claro). Más sobre este asunto en la próxima entrega.
 responseText: el contenido puramente textual del recurso remoto. Útil si no nos
devuelve XML.

Hay algunas cosas más pero con estas es más que suficiente para el 99% de los casos.

Vale por el momento. Quédate con esta idea. En la próxima entrega vamos a ver el uso
en la práctica de este objeto. Haremos una función genérica que nos sirva para obtener
cualquier URL remota y que funcione tanto en Internet Explorer como en los demás
navegadores del mercado.

4.3 el procerso cliente servidor

Las aplicaciones web ASP.NET no se limitan a los lenguajes y las herramientas basados
en servidor. Puede incluir ECMAScript (JavaScript o JScript) en sus páginas web
ASP.NET para crear funcionalidad enriquecida basada en explorador. ASP.NET
dispone de una amplia gama de características para la compatibilidad con los scripts de
cliente.

Una opción consiste en crear y agregar fragmentos de código individuales de script de


cliente a las páginas web ASP.NET para admitir el comportamiento de explorador que
diseñe para la aplicación. Esta opción resulta práctica si solo desea incluir algunas
partes pequeñas de código JavaScript o si trabaja con código JavaScript que ya tiene.
Esta opción también permite que el tamaño de las páginas web ASP.NET sea el
mínimo.

Asimismo, puede aprovechar las eficaces características AJAX de ASP.NET. Entre


estas características AJAX se incluye un completo marco de trabajo que admite lo
siguiente:

 Programación orientada a objetos en JavaScript.


 Postbacks asincrónicos.

 Servicios Web de aplicación para autenticación y perfiles.

 Controles de servidor que administran los scripts de cliente con compatibilidad


ampliada para depuración y seguimiento de traza.

Las características AJAX de ASP.NET permiten aprovechar las ventajas de la


funcionalidad de JavaScript con menos codificación manual. Esta proporciona la
funcionalidad de JavaScript ampliada, además de un marco de trabajo para crear la
funcionalidad de cliente que se integra en ASP.NET.

En este tema se proporciona información general sobre las opciones para agregar script
de cliente a las páginas web ASP.NET. Contiene las siguientes secciones:

 Escenarios
 Incluir script de cliente personalizado en páginas ASP.NET

 Ampliar JavaScript con características AJAX de ASP.NET

 Controles de servidor ASP.NET que dependen de scripts de cliente

 Agregar eventos del script de cliente a los controles de servidor ASP.NET

 Hacer referencia a controles de servidor en scripts de cliente

 Provocar eventos Click de cliente para los controles de servidor

 Comunicación entre scripts de cliente y código de servidor

 Crear componentes de script de cliente

 Agregar funcionalidad de cliente a los controles de servidor

4.4 sintaxis básica para los métodos get/post

Para el método GET

<?php function algo()


{
_objetus=objetus() //crear objeto
_values_send="variable=valor&otrovar=otvalor" //variables
_URL_="algo.php?" //URL
_objetus.open("GET",_URL_+"&"+_values_send,true); //abrir
procesador
_objetus.onreadystatechange=function() { //funcion controlador
if (_objetus.readyState==4) //control de estados del proceso
{
//si se da un status 200 (TERMINADO CON EXITO)
if(_objetus.status==200)
{
//procesos que se realizaran con los datos obtenidos
}
}
}
_objetus.send(null); //envío nulo de variables
}

# Para el método POST

<?php function algo()


{
_objetus=objetus() //crear objeto
_values_send="variable=valor&otrovar=otvalor" //variables
_URL_="algo.php?" //URL
_objetus.open("POST",_URL_,true); //abrir procesador
_objetus.setRequestHeader('Content-Type','application/x-www-
form-urlencoded');
//cabeceras POST
_objetus.send('&'+_values_send); //enviar variables
_objetus.onreadystatechange=function() { //funcion controlador
if (_objetus.readyState==4) //control de estados del proceso
{
//si se da un status 200 (TERMINADO CON EXITO)
if(_objetus.status==200)
{
//procesos que se realizaran con los datos obtenidos
}
}
}
}

4.5 recibiendo los resultados del procesador

Hay dos maneras en las que se puede


recibir la informacion devuelta por el
procesador, las propiedades:
responseText y responseXML

# responseText: Con esta propiedad se reciben los datos de la siguiente manera. Cuando el estado del
proceso esté en el nivel 4

<?php vari=objetus.responseText

Entonces aqui la variable vari contendrá el resultado del procesador.


Ejemplo:

<?php window.alert(vari)

Esto es lo que usamos en nuestro primer ejemplo, aqui cuando el proceso llega a nivel 4 creamos un alert
con los datos que nos a enviado el procesador.

# responseXML:
Con esta propiedad el procesador nos devuelve los datos como XML y debemos recorrerlo mediante las
funciones del DOM (getEementsByTagName, etc).

<?php vari=objetus.responseXML

Guardamos el documento devuelto en la variable vari para luego recorrerla,en el caso para nuestro
ejemplo el documento XML del procesador tendrá la siguente estructura:

<serv>
<ip>ip</ip>
<uri>uri </uri>
<date>date</date>
</serv>

<?php var _ip = vari.getElementsByTagName('ip').item(0).firstChild.data;


var _uri = vari.getElementsByTagName('uri').item(0).firstChild.data;
var _date = vari.getElementsByTagName('date').item(0).firstChild.data;

Entonces mostraremos:

<?php window.alert(_ip+"\n"+_uri+"\n"+_date)

Hagamos el Ejemplo1 con responseXML

Ejemplo 1-b

cliente

<?php <script language="javascript" type="text/javascript">


# funcion encargada de crear el objeto
function objetus() {
try {
objetus = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
objetus= new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
objetus= false;
}
}
if (!objetus && typeof XMLHttpRequest!='undefined') {
objetus = new XMLHttpRequest();
}
return objetus
}
# la funcion que hará el trabajo sucio
# esta funcion es la que llamamos en el evento ONCLICK
# de nuestro boton
function primer_tope()
{
# creamos el objeto
_objetus=objetus()
# cargamos una varible con las variables que vamos a enviar
_values_send="funcion=pt"
_URL_="procesador.php?"
_objetus.open("GET",_URL_+"&"+_values_send,true);
# una vez enviado los valores llamamos a la propiedad
# onreadystatechange
_objetus.onreadystatechange=function() {
# dentro de la funcion comprobamos el estado del proceso
# si es 4 (terminado) pedimos lo que nos han mandado
if (_objetus.readyState==4)
{
# si se da un status 200 (TERMINADO CON EXITO)
if(_objetus.status==200)
{
# usamos la propiedad responseText para recibir en una cadena
# lo que nos mandaron
window.alert(_objetus.responseText);
}
}
}
obligatorio .... luego explicarè el porque
_objetus.send(null);
}
function primer_topeXML()
{
_objetus=objetus()
_values_send="funcion=ptxml"
_URL_="procesador.php?"
_objetus.open("GET",_URL_+"&"+_values_send,true);
_objetus.onreadystatechange=function() {
if (_objetus.readyState==4)
{
if(_objetus.status==200)
{
var vari=_objetus.responseXML;
var _i = vari.getElementsByTagName('ip').item(0).firstChild.data;
var _u = vari.getElementsByTagName('uri').item(0).firstChild.data;
var _d = vari.getElementsByTagName('date').item(0).firstChild.data;
window.alert(_i+"\n"+_u+"\n"+_d);
}
}

}
_objetus.send(null);
return
}
</script>
<input type="button" value="con rexponseText"
onclick="primer_tope();"><br>
<input type="button" value="con rexponseXML"
onclick="primer_topeXML();">

<!-- mas documento HTML -->

procesador

<?php <?php
if(isset($_GET['funcion']))
{
$_valor=$_GET['funcion'];
if($_valor=="pt")
{
$_pt="Tu ip: ".$_SERVER['REMOTE_ADDR']."\n";
$_pt.="request_uri:";
$_pt.=htmlspecialchars($_SERVER['REQUEST_URI'])."\n";
$_pt.="date(): ".date("d-m-Y : H-i-s")."\n";
echo $_pt;
}
elseif ($_valor=="ptxml")
{
$_xml="<?xml version=\"1.0\" standalone=\"yes\"?>\n";
$_xml.="<serv>\n";
$_xml.="<ip>Tu ip: ".$_SERVER['REMOTE_ADDR']."</ip>\n";
$_xml.="<uri>request_uri:";
$_xml.=htmlspecialchars($_SERVER['REQUEST_URI']);
$_xml.="</uri>\n";
$_xml.="<date>".date("d-m-Y : H-i-s")."</date>\n";
$_xml.="</serv>\n";
//mandamemos cabeceras identificando al documento
//como un documento XML
header('Content-Type: text/xml');
echo $_xml;
}
else
{
echo "No enviaste ningun valor ACEPTABLE";
}
}
else
{
echo "No se a enviado valor alguno de peticion";
}
?>

4.6. re-renderizando elementos

Hasta ahora hemos manejado los datos


que nos llegaban del procesador
viendolos con un alert
(window.alert(respuesta)) pues bien
ahora vamos a "embeder" los
resultados en nuestras páginas,
tenemos 2 maneras de llamar al
elemento donde se pondrá el nuevo
contenido:
 

document.getElementById("elementID") : Llamaremos al elemento por el ID

<div id="nombreid" ></div>

Entonces vamos a cambiar nuestro window.alert(respuesta) por


document.getElementById(target) aplicandole la propiedad innerHTML, quedandonos:

<?php var _ip = vari.getElementsByTagName('ip').item(0).firstChild.data;


var _uri = vari.getElementsByTagName('uri').item(0).firstChild.data;
var _date = vari.getElementsByTagName('date').item(0).firstChild.data;

Entonces mostraremos:

<?php window.alert(_ip+"\n"+_uri+"\n"+_date)

Hagamos el Ejemplo1 con responseXML

Ejemplo 1-b

cliente

<?php target="nombreid";
document.getElementById(target).innerHTML = _objetus.responseText;

* document.getElementsByTagName("tagName") : Llamaremos al elemento por su tag name

Por analizar este ejemplo..........

No tengo una idea clara a como llamar por su tag name, porfavor pido la ayuda de alguien que sepa esto

Ejemplo 2
Solo cambiará nuestro cliente.

<?php <script language="javascript" type="text/javascript">


# funcion encarga de crear el objeto
function objetus() {
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp
}
function primer_tope()
{
_objetus=objetus()
_values_send="funcion=pt"
_URL_="procesador.php?"
_objetus.open("GET",_URL_+"&"+_values_send,true);
_objetus.onreadystatechange=function() {
if (_objetus.readyState==4)
{
if(_objetus.status==200)
{
target="nuestrodiv_id"
document.getElementById(target).innerHTML=_objetus.responseText;
}
}
}
_objetus.send(null);
return
}
</script>
<input type="button" name="visual" value="Pedir"
onclick="primer_tope();">
<!-- aqui se carga el resultado -->
<div id="nuestrodiv_id"></div>

5. publicación de sitios web

5.1 alojamiento web

El alojamiento web (en inglés web hosting) es el servicio que provee a los usuarios de
Internet un sistema para poder almacenar información, imágenes, vídeo, o cualquier
contenido accesible vía web. Es una analogía de "hospedaje o alojamiento en hoteles o
habitaciones" donde uno ocupa un lugar específico, en este caso la analogía alojamiento
web o alojamiento de páginas web, se refiere al lugar que ocupa una página web, sitio
web, sistema, correo electrónico, archivos etc. en internet o más específicamente en un
servidor que por lo general hospeda varias aplicaciones o páginas web.

Las compañías que proporcionan espacio de un servidor a sus clientes se suelen


denominar con el término en inglés web host.

El hospedaje web aunque no es necesariamente un servicio, se ha convertido en un


lucrativo negocio para las compañías de internet alrededor del mundo.

Se puede definir como "un lugar para tu página web o correos electrónicos", aunque
esta definición simplifica de manera conceptual el hecho de que el alojamiento web es
en realidad espacio en Internet para prácticamente cualquier tipo de información, sea
archivos, sistemas, correos electrónicos, videos etc.

5.2 dominio

¿Registrar o No Registrar un Dominio? Porqué no


Registrarlo es Generalmente Una Mala Opción.-
Para publicar sus archivos Web en Internet puede hacerlo sin comprar un Registro
de Dominio Web. Esta opción no se puede hacer de otra manera que recurriendo a
un tercero que sí tenga un dominio Web registrado y que acepte albergar sus
páginas gratuitamente. Con eso el destino de su sitio queda atado a la voluntad de
ese tercero. Esos terceros le alojarán sus páginas en sus servidores y éstas podrán
ser llamadas en Internet con la inclusión del nombre de dominio ajeno en la
dirección Web. Por ejemplo, si en el sitio ajeno.com le ofrecen la publicación de sus
páginas en Internet, ese sitio le alojará sus páginas de modo que la gente podrá
llamar a estas y otros archivos con una dirección como

o también como

Hay varios sitios de Internet a los que recurrir para publicar sus páginas gratis.
Estos no le cobran, pero se benefician del tráfico virtual que atraigan sus páginas.
Generalmente su beneficio provendrá de la publicidad que insertan en sus páginas
Web. Hay mas razones para desechar las publicaciones sin registro propio en
Internet. Veamos.

¿Porqué es generalmente necesario contar con la


Propiedad de un Nombre de Dominio en Internet?
Su registro tiene ventajas importantes y esenciales para el funcionamiento de las
páginas y otros archivos Web. Algunas autorizaciones no se otorgan a los sitios
publicados gratuitamente. Esas autorizaciones, entre otras, se pueden referir a
funcionalidades comerciales que incluyen los cobros electrónicos y el correo
electrónico comercial. La alternativa a no registrarse consiste en alojar sus archivos
Web en el sitio de un tercero. Esos terceros suelen tener derechos que les permiten
excluir el acceso a Internet sin aviso previo. También pueden no autorizar las
funcionalidades comerciales que necesite para ellos protegerse legalmente o por
otros motivos.

Si el sitio del tercero desaparece, o este impide el acceso a sus archivos, nadie
puede visitar sus paginas Web con la dirección anteriormente asignada. Aunque se
cambie al sitio de otro tercero o decida registrar tardíamente un dominio e incluir
allí su sitio, perderá todos los accesos en los buscadores y los visitantes virtuales
que llamen a sus direcciones Web anteriores no las accederán. Esto porque su
dirección http// será distinta al no incluir el dominio del sitio anterior.

Por supuesto hay situaciones de excepción por los cuales se pueda tener un sitio en
Internet sin su propio registro de propiedad. Eso puede hacerse y puede ser
absolutamente gratuito. Pero si su propósito es comercial, muy probablemente no
le será conveniente funcionar sin un acceso propio a Internet. Si puede realizar un
contrato para proteger sus derechos, tal vez el no operar con un dominio propio le
sería conveniente comercialmente. Pero eso le traerá un costo por lo general y sus
riesgos de pérdida al acceso a su sitio, aunque estén protegidos legalmente,
también pueden materializarse con un daño serio a su negocio.

Registros de Dominios en Internet.- Estos se hacen con la compra


del derecho a usar un nombre de dominio en forma exclusiva. Ese nombre aparece
en esta página y es jfinternational.com y la palabra que le antecede "comercioweb"
es solo un subdominio. El registro del nombre jfinternational.com se paga a
Network Solutions (networksolutions.com) que es uno de los servicios que se
encargan de registrarlos autorizados por ICANN (ver Listado de Registradores en el
sitio ICANN-Accredited Registrars:

http://www.icann.org/en/registrars/accredited-list.html

Para jfinternational.com, Network Solutions se encarga de guardar en una base de


datos el nombre jfinternational.com con los datos de su propietario, quien es que
escribe estas líneas.

Los registradores autorizados para los códigos de máximo nivel reservados a países
(con los códigos con dos letras tales como .cl .ar .br. .mx .co .es, etc.,) están en
Internet Assigned Numbers Authority (IANA) cuya página Web indicada aquí al final
de este párrafo permite verlos presionando el código de país respectivo y luego
ubicando al final de la siguiente página donde dice "Subdomain Information": vea
esto en IANA-Internet Assigned Numbers Authority:

http://www.iana.org/domains/root/db/

Si desea registrarse y/o saber si el nombre planeado está ya registrado o no, puede
buscar en Google por " registro de dominios" o "domain registry". Note que puede
hacer este registro desde los sitios de alojamiento Web que proporcionan el registro
previo para alojar su sitio bajo el nombre de dominio que compre. Eso así esta
incluído en el precio. Las ofertas "gratis" por inscribir el nombre de su sitio allí no
significan que realmente no se pague por ese derecho.

Una opción al registrarse que comúnmente se ofrece es no inscribir públicamente el


acceso a sus datos personales. Esos datos quedan de todos modos con acceso a los
servicios autorizados, pero no al público general.
Identidad del Propietario del Dominio.- La base de datos de
esos registros es alimentada por todos los registradores autorizados y es accesible
al público por Internet, y por supuesto, es también accesible a los servicios que
procedan a comprobar si un determinado nombre de dominio existe, o sea, si tiene
actualmente un propietario. Network Solutions, así como cualquier otro registrador,
antes de registrar esos nombres se encarga de comprobar quién es su propietario y
sus señas de identificación. Como el pago es por tarjeta de crédito o por
transferencia bancaria, eso permite comprobar, entre otros métodos, a la persona o
institución que sea propietaria de un nombre de dominio.

Todos los Registros de Dominio de Internet son


Pagados.- El pago por estos registros es ineludible para propagar el acceso de
un sitio Web en Internet. La inclusión de los nombres de dominios en la base de
datos de Internet no es gratis. Alguien debe pagarla. Ese alguien puede ser la
persona o empresa que desea este registro. O, también puede ser pagado por el
servicio de alojamiento Web en el que se guardan las páginas de esa persona o
empresa. En este último caso, puede alguien recibir una oferta de registro gratis de
un alojador de Internet, pero en la realidad ocurre que eso suele ser mas bien una
oferta que induce a la contratación del servicio de alojamiento. El registro se paga
de todos modos y su pago por el alojamiento permite hacerlo.

5.3 transferencia de archivos al servidor ftp

La transferencia de archivos consiste simplemente en arrastrar los archivos situados en


la parte izquierda a la parte derecha. A esta transferencia se le suele llamar
coloquialmente subir los archivos. Este proceso puede tardar un tiempo, si hemos
empleado muchos archivos o muy grandes. El panel inferior nos va mostrando
información del proceso.

Se guarda un registro de la transferencia en el panel inferior, indicado por


Transferencias fallidas y Transferencias satisfactorias. En fallidas no debería haber
ningún archivo, si todo ha ido bien.

Al finalizar, tendremos en el servidor remoto una copia exacta del contenido de nuestro
ordenador.
En este proceso sólo necesitaremos tener una precaución: la estructura de los archivos
debe mantenerse exactamente igual que la local, es decir, si habíamos distribuido los
archivos por carpetas, debemos mantener el mismo sistema.

Nota
No debemos olvidar que nuestra página principal debe llamarse index.htm o
index.html, ya que ésa será la que se cargue automáticamente por parte del servidor,
cuando alguien acceda a nuestro espacio.

En este punto ya podemos acceder al navegador e introducir la dirección


correspondiente para ver nuestro espacio web. La dirección nos la facilita también el
servicio de almacenamiento que estemos empleando. Observemos la figura:
Además del nombre del servidor, de algún modo suele aparecer el nombre de la cuenta
o de la carpeta. En nuestro ejemplo, además, hemos añadido el nuevo contenido en una
carpeta llamada miweb, para no mezclarlo con otros espacios ya creados en ese mismo
servidor. Obviamente un mismo servidor puede contener tantos sitios web como
necesitemos, con tan sólo distribuirlos en carpetas diferentes.

Enlaces relativos y absolutos


Si al comenzar a probar el sitio web, observamos que algún enlace no funciona o alguna
imagen no se muestra, probablemente nos encontremos ante el conocido problema de
las referencias relativas o absolutas, que ya tratamos en el apartado de los enlaces. Este
problema lo notaremos especialmente al ver nuestra web en otro ordenador o al
indicarle a otra persona que acceda a nuestra web. Esto es así porque, si hemos
empleado referencias absolutas a archivos de nuestro propio ordenador, nosotros sí
veremos correctamente los enlaces, pero el resto de las personas no, ya que no tienen
una copia local de los archivos colocados exactamente igual que nosotros.

Si no se nos ha producido este problema, podemos felicitarnos porque prestamos la


suficiente atención al crear cada enlace a otra página y al insertar imágenes. Si por el
contrario nos encontramos con esta incidencia, debemos editar los enlaces erróneos y
asegurarnos de que los convertimos en relativos a la página web en cuestión.
Una vez solventados los problemas, debemos llevar de nuevo los archivos al servidor
remoto, sobrescribiendo los que allí se encuentren.

Gestión de archivos remotos


Filezilla nos sirve para hacer una gestión completa de los archivos del servidor.
Podemos realizar múltiples operaciones sobre ellos, desde crear carpetas, eliminar
archivos, moverlos, renombrarlos, etc. incluso cambiar sus permisos de acceso, como
haríamos en cualquier ordenador con sistema Linux.

Cuando terminemos de trabajar con la aplicación, podemos cerrar el programa y dar por
terminado el proceso. Nuestra página web ya ha sido creada.

Caracteres especiales
Por cuestiones relacionadas con el tipo de codificación de los documentos y las
diferencias que puedan existir con el servidor, se nos puede dar el caso de que, al
transferir un sitio web, observemos que las tildes no se muestran correctamente, las eñes
y otros caracteres especiales.

Los motivos por los que esto sucede son complejos, pero no así la solución, que pasa
por indicar en BlueGriffon que reemplace los caracteres especiales por códigos
estandarizados en HTML. Esto se consigue seleccionando la opción
Herramientas>Preferencias y posteriormente la pestaña Documentos.

En la parte denominada Mostrar los siguientes caracteres como entidades


seleccionaremos la opción Todos los caracteres especiales de HTML 4, como se
muestra en la figura:
Así se reemplazarán los caracteres especiales por códigos, que serán interpretados
correctamente por el navegador.

6. SEVICIOS WEB

Un servicio web (en inglés, Web Service o Web services) es una tecnología que utiliza
un conjunto de protocolos y estándares que sirven para intercambiar datos entre
aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de
programación diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los
servicios web para intercambiar datos en redes de ordenadores como Internet. La
interoperabilidad se consigue mediante la adopción de estándares abiertos. Las
organizaciones OASIS y W3C son los comités responsables de la arquitectura y
reglamentación de los servicios Web. Para mejorar la interoperabilidad entre distintas
implementaciones de servicios Web se ha creado el organismo WS-I, encargado de
desarrollar diversos perfiles para definir de manera más exhaustiva estos estándares. Es
una máquina que atiende las peticiones de los clientes web y les envía los recursos
solicitados.

6.1. estándares empleados

 Web Services Protocol Stack: Así se le denomina al conjunto de servicios y


protocolos de los servicios Web.
 XML (Extensible Markup Language): Es el formato estándar para los datos que
se vayan a intercambiar.
 SOAP (Simple Object Access Protocol) o XML-RPC (XML Remote Procedure
Call): Protocolos sobre los que se establece el intercambio.
 Otros protocolos: los datos en XML también pueden enviarse de una aplicación
a otra mediante protocolos normales como HTTP (Hypertext Transfer Protocol),
FTP (File Transfer Protocol), o SMTP (Simple Mail Transfer Protocol).
 WSDL (Web Services Description Language): Es el lenguaje de la interfaz
pública para los servicios Web. Es una descripción basada en XML de los
requisitos funcionales necesarios para establecer una comunicación con los
servicios Web.
 UDDI (Universal Description, Discovery and Integration): Protocolo para
publicar la información de los servicios Web. Permite comprobar qué servicios
web están disponibles.
 WS-Security (Web Service Security): Protocolo de seguridad aceptado como
estándar por OASIS (Organization for the Advancement of Structured
Information Standards). Garantiza la autenticación de los actores y la
confidencialidad de los mensajes enviados.

6.1.1. Web servicesprotocolsnack

La Pila de protocolos para Servicios Web es una colección de protocolos y estandares


para redes de Computadores que son utilizados para definir, localizar, implementar y
hacer que un Servicio Web interactúe con otro. La Pila de Protocolos para servicios
está comprendida principalmente por cuatro áreas:
 Servicio de Transporte: responsable del transporte de mensajes entre las
Aplicaciones de red y los protocolos en los cuales se incluyen protocolos tales
como HTTP, SMTP, FTP, así como también el más reciente Blocks Extensible
Exchange Protocol (BEEP).
 Mensajeria XML: responsable por la codificación de mensajes en un formato
común XML así que ellos puedan ser entendidos en cualquier extremo de una
conexión de red. Actualmente, esta área incluye protocolos tales como XML-
RPC, SOAP y REST.
 Descripción del Servicio: usado para describir la interfaz pública de un Servicio
Web especifico. El formato de interfaz Web Services Description Language -
WSDL es típicamente usado para este propósito.
 Descubrimiento de servicios: centraliza servicios en un registro común tal que
los servicios Web de la red puedan publicar su localización y descripción, y hace
que sea fácil descubrir que servicios están disponibles en la red. Actualmente, la
API Universal Description Discovery and Integration - UDDI se utiliza
normalmente para el descubrimiento de servicios.

La Pila de Protocolos para servicios también incluye un amplio rango de protocolos


recientemente definidos:Business Process Execution Language - BPEL, SOAP Security
Extensions: Digital Signature - SOAP-DSIG.

6.1.2. xml

Un servicio web XML es una entidad programable que proporciona un elemento


determinado de funcionalidad, como lógica de la aplicación y es accesible por diversos
sistemas potencialmente dispares usando los estándares de Internet ubicuos, como XML
y HTTP. Los servicios web XML dependen en gran medida de la amplia aceptación de
XML y otros estándares de Internet para crear una infraestructura que admita la
interoperabilidad de aplicaciones en un nivel que resuelva muchos de los problemas que
anteriormente impidieron tales intentos.

Un servicio web XML puede usarse internamente por una sola aplicación o exponerse
externamente a través de Internet para su uso por diversas aplicaciones. Puesto que es
accesible a través de una interfaz estándar, un servicio web XML permite a sistemas
heterogéneos funcionar juntos como una sencilla web de cálculo.

En lugar de seguir las funciones genéricas de portabilidad de código, los servicios web
XML proporcionan una solución viable para habilitar los datos y la interoperabilidad del
sistema. Los servicios web XML usan la mensajería basada en XML como un medio
fundamental para la comunicación de datos y ayudar a salvar las diferencias que existen
entre los sistemas que usan modelos de componentes, sistemas operativos y lenguajes
de programación incongruentes. Los programadores pueden crear aplicaciones que
desarrollen juntas servicios web XML de varios orígenes de la misma manera que usan
tradicionalmente los componentes para crear una aplicación distribuida.

Una de las características básicas de un servicio web XML es el alto grado de


abstracción que existe entre la implementación y el uso de un servicio. Al usar la
mensajería basada en XML como el mecanismo para crear y tener acceso al servicio, el
cliente y el proveedor del servicio web XML se liberan de la mutua necesidad de tener
información de las entradas, las salidas y la ubicación.

Los servicios web XML habilitan una nueva era de desarrollo de aplicaciones
distribuidas. Ya no se trata de una guerra de modelos de objetos o concursos de belleza
de lenguajes de programación. Cuando los sistemas cooperan estrechamente usando
infraestructuras de propietario, esto se hace con cargo a la interoperabilidad de la
aplicación. Los servicios web XML proporcionan la interoperabilidad en un nivel
completamente nuevo que niega tales rivalidades contraproducentes. El próximo avance
revolucionario de Internet será que los servicios web XML se convertirán en la
estructura fundamental que vincule juntos los dispositivos informáticos.

6.1.3. soap

OAP (siglas de Simple Object Access Protocol) es un protocolo estándar que define
cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio
de datos XML. Este protocolo deriva de un protocolo creado por Dave Winer en 1998,
llamado XML-RPC. SOAP fue creado por Microsoft, IBM y otros. Está actualmente
bajo el auspicio de la W3C. Es uno de los protocolos utilizados en los servicios Web.

Características
SOAP puede formar la capa base de una "pila de protocolos de web service", ofreciendo
un framework de mensajería básica en la cual los web services se puedan construir. Este
protocolo basado en XML consiste de tres partes: un sobre (envelope), el cual define
qué hay en el mensaje y cómo procesarlo; un conjunto de reglas de codificación para
expresar instancias de tipos de datos; y una convención para representar llamadas a
procedimientos y respuestas. El protocolo SOAP tiene tres características principales:

 Extensibilidad (seguridad y WS-routing son extensiones aplicadas en el


desarrollo).
 Neutralidad (SOAP puede ser utilizado sobre cualquier protocolo de transporte
como HTTP, SMTP, TCP o JMS).
 Independencia (SOAP permite cualquier modelo de programación).

Como ejemplo de cómo los procedimientos SOAP pueden ser utilizados, un mensaje
SOAP podría ser enviado a un sitio Web que tiene habilitado Web service, para realizar
la búsqueda de algún precio en una base de datos, indicando los parámetros necesitados
en la consulta. El sitio podría retornar un documento formateado en XML con el
resultado, ejemplo, precios, localización, características. Teniendo los datos de
respuesta en un formato estandarizado "parseable", este puede ser integrado
directamente en un sitio Web o aplicación externa.

La arquitectura SOAP consiste de muchas capas de especificación: para el formato del


mensaje, MEP (Message Exchange Patterns), subyacentes enlaces de protocolo de
transporte, modelo de procesamiento de mensajes, y extensibilidad del protocolo. SOAP
es el sucesor de XML-RPC, a pesar de que toma el transporte y la neutralidad de la
interacción y el envelope / header / body de otra parte (probablemente de WDDX).
Ejemplos de mensajes SOAP
Como ejemplo se muestra la forma en que un cliente solicitaría información de un
producto a un proveedor de servicios Web:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetails xmlns="http://warehouse.example.com/ws">
<productId>827635</productId>
</getProductDetails>
</soap:Body>
</soap:Envelope>

Y esta sería la respuesta del proveedor:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetailsResponse
xmlns="http://warehouse.example.com/ws">
<getProductDetailsResult>
<productName>Toptimate 3-Piece Set</productName>
<productId>827635</productId>
<description>3-Piece luggage set. Black
Polyester.</description>
<price>96.50</price>
<inStock>true</inStock>
</getProductDetailsResult>
</getProductDetailsResponse>
</soap:Body>
</soap:Envelope>

A pesar de no ser la única opción posible, HTTP fue elegido como protocolo de
transporte por sus ventajas, para lidiar con cortafuegos, por ejemplo. Otros protocolos
como GIOP/IIOP o DCOM (utilizados en CORBA, RMI y DCOM) suelen ser repelidos
por estos cortafuegos.

6.1.4. wsdl

WSDL son las siglas de Web Services Description Language, un formato XML que se
utiliza para describir servicios Web . La versión 1.0 fue la primera recomendación por
parte del W3C y la versión 1.1 no alcanzó nunca tal estatus. La versión 2.0 se convirtió
en la recomendación actual por parte de dicha entidad.

WSDL describe la interfaz pública a los servicios Web. Está basado en XML y describe
la forma de comunicación, es decir, los requisitos del protocolo y los formatos de los
mensajes necesarios para interactuar con los servicios listados en su catálogo. Las
operaciones y mensajes que soporta se describen en abstracto y se ligan después al
protocolo concreto de red y al formato del mensaje.

Así, WSDL se usa a menudo en combinación con SOAP y XML Schema. Un programa
cliente que se conecta a un servicio web puede leer el WSDL para determinar qué
funciones están disponibles en el servidor. Los tipos de datos especiales se incluyen en
el archivo WSDL en forma de XML Schema. El cliente puede usar SOAP para hacer la
llamada a una de las funciones listadas en el WSDL.

El WSDL nos permite tener una descripción de un servicio web. Especifica la interfaz
abstracta a través de la cual un cliente puede acceder al servicio y los detalles de cómo
se debe utilizar.

Estructura del WSDL


Como vemos, la estructura del WSDL tiene los siguientes elementos:

Tipos de Datos

<types>: Esta sección define los tipos de datos usados en los mensajes. Se utilizan los
tipos definidos en la especificación de esquemas XML.

Mensajes

<message>: Aquí definimos los elementos de mensaje. Cada mensaje puede consistir en
una serie de partes lógicas. Las partes pueden ser de cualquiera de los tipos definidos en
la sección anterior.

Tipos de Puerto

<portType>: Con este apartado definimos las operaciones permitidas y los mensajes
intercambiados en el Servicio.

Bindings

<binding>: Especificamos los protocolos de comunicación usados.

Servicios

<service>: Conjunto de puertos y dirección de los mismos. Esta parte final hace
referencia a lo aportado por las secciones anteriores.

Con estos elementos no sabemos qué hace un servicio pero sí disponemos de la


información necesaria para interactuar con él (funciones, mensajes de entrada/salida,
protocolos...).

Ejemplo
A continuación se muestra un ejemplo de un documento WSDL y sus diferentes
secciones. En este ejemplo concreto se implementa un servicio que muestra a partir del
nombre de un valor bursátil su valor actual en el mercado.

<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<types>
<schema targetNamespace="http://example.com/stockquote.xsd"
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
</types>

<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>

<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>

<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>

<binding name="StockQuoteSoapBinding"
type="tns:StockQuotePortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation
soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>

<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort"
binding="tns:StockQuoteSoapBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>

</definitions>

6.1.5. uddi

UDDI son las siglas del catálogo de negocios de Internet denominado Universal
Description, Discovery and Integration. El registro en el catálogo se hace en XML.
UDDI es una iniciativa industrial abierta (sufragada por la OASIS) entroncada en el
contexto de los servicios Web. El registro de un negocio en UDDI tiene tres partes:

 Páginas blancas - dirección, contacto y otros identificadores conocidos.


 Páginas amarillas - categorización industrial basada en taxonomías.
 Páginas verdes - información técnica sobre los servicios que aportan las propias
empresas.

UDDI es uno de los estándares básicos de los servicios Web cuyo objetivo es ser
accedido por los mensajes SOAP y dar paso a documentos WSDL, en los que se
describen los requisitos del protocolo y los formatos del mensaje solicitado para
interactuar con los servicios Web del catálogo de registros.

6.1.6 ws – security

WS-Security (Seguridad en Servicios Web) es un protocolo de comunicaciones que


suministra un medio para aplicar seguridad a los Servicios Web. En abril de 2004 el
estándar WS-Security 1.0 fue publicado por Oasis-Open. En 2006 fue publicada la
versión 1.1.

Originalmente desarrollado por IBM, Microsoft, y VeriSign, el protocolo es ahora


llamado oficialmente WSS y está desarrollado por un comité en Oasis-Open.

El protocolo contiene especificaciones sobre cómo debe garantizarse la integridad y


seguridad en mensajería de Servicios Web. El protocolo WSS incluye detalles en el uso
de SAML y Kerberos, y formatos de certificado tales como X.509.

La Integridad de datos y confidencialidad podrían también garantizarse sobre Servicios


Web a través del uso de la Transport Layer Security (TLS), por ejemplo enviando
mensajes sobre HTTPS. Esto puede reducir significativamente la sobrecarga, por
ejemplo eliminando la necesidad de codificar claves y firmas de mensaje en ASCII
antes de enviar. La parte negativa de usar TLS sería si los mensajes necesitaran pasar a
través de un servidor proxy, como si fuera necesario ver la petición para enrutado. En
tal caso, el servidor vería la petición que llega del proxy, no del cliente; esto podría ser
solventado si el proxy tiene una copia de la clave y certificado del cliente, o teniendo un
certificado de firmado de confianza para el servidor, con el cual podría generar un par
clave/certificado que coincida con aquellos del cliente. Sin embargo, el hecho de que el
proxy está operando el mensaje significa que no asegura la seguridad extremo a
extremo, sino que solo asegura la seguridad punto a punto.

WS-Security incorpora características de seguridad en el encabezado de un mensaje


SOAP, trabajando en la capa aplicación. Así asegura seguridad extremo a extremo.
6.2. ventajas de los servicios web

 Aportan interoperabilidad entre aplicaciones de software independientemente de


sus propiedades o de las plataformas sobre las que se instalen.
 Los servicios Web fomentan los estándares y protocolos basados en texto, que
hacen más fácil acceder a su contenido y entender su funcionamiento.
 Permiten que servicios y software de diferentes compañías ubicadas en
diferentes lugares geográficos puedan ser combinados fácilmente para proveer
servicios integrados.

6.3Inconvenientes de los servicios Web


 Para realizar transacciones no pueden compararse en su grado de desarrollo con
los estándares abiertos de computación distribuida como CORBA (Common
Object Request Broker Architecture).
 Su rendimiento es bajo si se compara con otros modelos de computación
distribuida, tales como RMI (Remote Method Invocation), CORBA o DCOM
(Distributed Component Object Model). Es uno de los inconvenientes derivados
de adoptar un formato basado en texto. Y es que entre los objetivos de XML no
se encuentra la concisión ni la eficacia de procesamiento.
 Al apoyarse en HTTP, pueden esquivar medidas de seguridad basadas en
firewall cuyas reglas tratan de bloquear o auditar la comunicación entre
programas a ambos lados de la barrera.

6.4. Razones para crear servicios Web


 La principal razón para usar servicios Web es que se pueden utilizar con HTTP
sobre TCP (Transmission Control Protocol) en el puerto 80. Dado que las
organizaciones protegen sus redes mediante firewalls -que filtran y bloquean
gran parte del tráfico de Internet-, cierran casi todos los puertos TCP salvo el 80,
que es, precisamente, el que usan los navegadores. Los servicios Web utilizan
este puerto, por la simple razón de que no resultan bloqueados. Es importante
señalar que los servicios web se pueden utilizar sobre cualquier protocolo, sin
embargo, TCP es el más común.
 Otra razón es que, antes de que existiera SOAP, no había buenas interfaces para
acceder a las funcionalidades de otros ordenadores en red. Las que había eran ad
hoc y poco conocidas, tales como EDI (Electronic Data Interchange), RPC
(Remote Procedure Call), u otras APIs.
 Una tercera razón por la que los servicios Web son muy prácticos es que pueden
aportar gran independencia entre la aplicación que usa el servicio Web y el
propio servicio. De esta forma, los cambios a lo largo del tiempo en uno no
deben afectar al otro. Esta flexibilidad será cada vez más importante, dado que la
tendencia a construir grandes aplicaciones a partir de componentes distribuidos
más pequeños es cada día más utilizada.
 Se espera que para los próximos años mejoren la calidad y cantidad de servicios
ofrecidos basados en los nuevos estándares.
6.5. Plataformas
Servidores de aplicaciones para servicios Web:

 JBoss servidor de aplicaciones J2EE Open Source de Red Hat inc.


 Oracle Fusion Middleware
 IBM Lotus Domino a partir de la versión 7.0
 Axis y el servidor Jakarta Tomcat (de Apache)
 ColdFusion MX de Macromedia
 Java Web Services Development Pack (JWSDP) de Sun Microsystems (basado
en Jakarta Tomcat)
 JOnAS (parte de ObjectWeb una iniciativa de código abierto)
 Microsoft .NET
 Novell exteNd (basado en la plataforma J2EE)
 WebLogic
 WebSphere
 JAX-WS con GlassFish
 Zope es un servidor de aplicaciones Web orientado a objetos desarrollado en el
lenguaje de programación Python
 VERASTREAM de AttachmateWRQ para modernizar o integrar aplicaciones
host IBM y VT
 PHP

6.6. Temas relacionados


 Oficina de servicios
 World Wide Web
 Web semántica
 SOAP
 SOA

6.7. Enlaces externos


 ESA y Web Services en SAP
 Estado del Arte: Servicios WEB
 Seguridad en Servicios WEB

Estructura de datos
1.INTRODUCCIÓN A LAS ESTRUCTURAS DE DATOS

1.1. Introducción
Como ya sabemos, las computadoras fueron diseñadas o ideadas como una herramienta
mediante la cual podemos realizar operaciones de cálculo complicadas en un lapso de
mínimo tiempo. Pero la mayoría de las aplicaciones de este fantástico invento del
hombre, son las de almacenamiento y acceso de grandes cantidades de información.

La información que se procesa en la computadora es un conjunto de datos, que pueden


ser simples o estructurados. Los datos simples son aquellos que ocupan sólo una
localidad de memoria, mientras que los estructurados son un conjunto de casillas de
memoria a las cuales hacemos referencia mediante un identificador único.

Debido a que por lo general tenemos que tratar con conjuntos de datos y no con datos
simples (enteros, reales, booleanos, etc.) que por sí solos no nos dicen nada, ni nos
sirven de mucho, es necesario tratar con estructuras de datos adecuadas a cada
necesidad.

Las estructuras de datos son una colección de datos cuya organización se caracteriza por
las funciones de acceso que se usan para almacenar y acceder a elementos individuales
de datos.

Una estructura de datos se caracteriza por lo siguiente:

 Pueden descomponerse en los elementos que la forman.


 La manera en que se colocan los elementos dentro de la estructura afectará la
forma en que se realicen los accesos a cada elemento.
 La colocación de los elementos y la manera en que se accede a ellos puede ser
encapsulada.

Ejemplo: Supongamos que nos enfrentamos a un problema como este: Una empresa
que cuenta con 150 empleados, desea establecer una estadística sobre los salarios de sus
empleados, y quiere saber cual es el salario promedio, y también cuantos de sus
empleados gana entre $1250.00 y $2500.00.

Si tomamos la decisión de tratar este tipo de problemas con datos simples, pronto nos
percataríamos del enorme desperdicio de tiempo, almacenamiento y velocidad. Es por
eso que para situaciones de este tipo la mejor solución son los datos estructurados.

1.2. TERMINOLOGIA BASICA , ORGANIZACIÓN ELEMENTAL DE LOS


DATOS

Terminología básica
 Dato: hechos conocidos que pueden registrarse y que tienen un significado implícito. Por
ejemplo: un 500.
 Información: datos cuya forma o formato es útil para ser usado en el proceso de toma de
decisiones. Por ejemplo: 500 milímetros de lluvia caída.
 Estructura de datos: es un enfoque para la organización de los datos en un sistema de
información.
 Sistema de archivos: es un conjunto de TDAs que son implementados para el
almacenamiento, la organización jerárquica, la manipulación, el acceso, el direccionamiento y
la recuperación de datos.
 Base de datos: conjunto de datos interrelacionados, almacenados de forma tal que
representan alguna parte de universo del discurso. Constituye un conjunto de datos
lógicamente coherente, que guarda en sí mismo un cierto significado.
 DBMS (Sistema gestor de bases de datos): es un conjunto de programas que permite a los
usuarios crear y mantener una base de datos.
 Sistemas de bases de datos: conjunto formado por la base de datos y el software necesario
para manipularla (DBMS).

Diseño de estructuras de datos


Objetivos del diseño de un modelo de datos
Es lograr la representación de un sistema del “mundo real” de manera que pueda ser
manejado en un mundo informático.
Niveles de diseño de un modelo de datos (5)
a) Identificación de los datos de la realidad.
Grupo CUYS (Como Usted Ya Sabe) | WWW.CUYS.COM.AR Fac. Cs. Exactas (UNICEN) | Pág. 2

b) Abstracción de los datos.


c) Identificación de relaciones entre datos.
d) Representación de datos.
e) Codificación.

1.3. ESTRUCTURA DE DATOS


En programación, una estructura de datos es una forma de organizar un conjunto de
datos elementales con el objetivo de facilitar su manipulación. Un dato elemental es la
mínima información que se tiene en un sistema.

Una estructura de datos define la organización e interrelación de estos y un conjunto de


operaciones que se pueden realizar sobre ellos. Las operaciones básicas son:

 Alta, adicionar un nuevo valor a la estructura.

 Baja, borrar un valor de la estructura.

 Búsqueda, encontrar un determinado valor en la estructura para realizar una


operación con este valor, en forma secuencial o binario (siempre y cuando los
datos estén ordenados).

Otras operaciones que se pueden realizar son:

 Ordenamiento, de los elementos pertenecientes a la estructura.


 Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las
apareadas.

Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia


para la realización de cada operación. De esta forma, la elección de la estructura de
datos apropiada para cada problema depende de factores como la frecuencia y el orden
en que se realiza cada operación sobre los datos.

1.4. OPERACIONES CON ESTRUCTURAS DE DATOS

DESCRIPCIÓN DE LAS OPERACIONES, EN ESTRUCTURA DE DATOS, DE RECORRIDO,


BÚSQUEDA, INSERCIÓN Y ELIMINACIÓN

Las operaciones que se suelen realizar habitualmente sobre una estructura lineal, sea
esta un array o una lista enlazada, sin las siguientes:

A) RECORRIDO.- Procesamiento de cada elemento de la lista.


B) BÚSQUEDA.- Búsqueda de la posición ocupada por un elemento con un
determinado valor o del registro con un determinado valor de clave.
C) INSERCIÓN.- Adición de un nuevo elemento a la lista.
D) BORRADO.- Eliminación de un elemento de la lista.

DESCRIPCIÓN DE LAS OPERACIONES, EN ESTRUCTURA DE DATOS

ORDENACIÓN Y MEZCLA

A) ORDENACIÓN.- Organizar los elementos de la lista de acuerdo con algún tipo de orden.
B) MEZCLA.- Combinar dos listas en una sola.

1.5 ALGORITMOS COMPLEJIDAD Y RELACION TIEMPO Y ESPACIO

Algoritmo, el conjunto de pasos para resolver un problema, mientras que complejidad


significa la cantidad de recursos que se utilizan para llegar a una meta.
Un algoritmo será mas eficiente comparado con otro, siempre que consuma menos
recursos, como el tiempo y espacio de memoria necesarios para ejecutarlo.

La complejidad de un algoritmo es aquella función que da el tiempo de y/o el espacio


utilizado por el algoritmo en función del tamaño de la entrada.
Cada algoritmo guarda una estrecha relación con una estructura de datos. Por ello, no
siempre es posible utilizar el algoritmo más eficiente, puesto que la elección de las
estructuras de datos depende de varias cuestiones, incluida la de qué tipo de datos
administramos y la frecuencia con que se realizan diferentes operaciones sobre ellos.
Así, deberemos encontrar una situación compromiso entre tiempo y compromiso
utilizados. En general, si aumentamos el espacio necesario para almacenar los datos,
conseguiremos un mejor rendimiento en el tiempo y viceversa.

La eficiencia de un algoritmo puede ser cuantificada con las siguientes medidas de


complejidad:
1. Complejidad Temporal o Tiempo de ejecución. Tiempo de cómputo necesario para
ejecutar algún programa.
2. Complejidad Espacial. Memoria que utiliza un programa para su ejecución, La
eficiencia en memoria de un algoritmo indica la cantidad de espacio requerido para
ejecutar el algoritmo; es decir, el espacio en memoria que ocupan todas las variables
propias al algoritmo. Para calcular la memoria estática de un algoritmo se suma la
memoria que ocupan las variables declaradas en el algoritmo. Para el caso de la
memoria dinámica, el cálculo no es tan simple ya que, este depende de cada ejecución
del algoritmo.

Este análisis se basa en las Complejidades Temporales, con este fin, para cada problema
determinaremos una medida N, que llamaremos tamaño de la entrada o número de datos
a procesar por el programa, intentaremos hallar respuestas en función de dicha N.

El concepto exacto que cuantifica N dependerá de la naturaleza del problema, si


hablamos de un array se puede ver a N como el rango del array, para una matriz, el
número de elementos que la componen; para un grafo, podría ser el número de nodos o
arcos que lo arman, no se puede establecer una regla para N, pues cada problema
acarrea su propia lógica y complejidad.

Aritmética De La Notación O.

El tiempo de ejecución es proporcional, esto es, multiplica por una constante a alguno
de los tiempos de ejecución anteriormente propuestos, además de la suma de algunos
términos más pequeños. Así, un algoritmo cuyo tiempo de ejecución sea T = 3N2 + 6N
se puede considerar proporcional a N2. En este caso se diría que el algoritmo es del
orden de N2, y se escribe O(N2).

Los grafos definidos por matriz de adyacencia ocupan un espacio O(N2), siendo N el
número de vértices de éste.
La notación O-grande ignora los factores constantes, es decir, ignora si se hace una
mejor o peor implementación del algoritmo, además de ser independiente de los datos
de entrada del algoritmo. Es decir, la utilidad de aplicar esta notación a un algoritmo es
encontrar un límite superior del tiempo de ejecución.

A veces ocurre que no hay que prestar demasiada atención a esto. Por ejemplo, el
tiempo de ejecución del algoritmo Quick Sort es de O(N2). Sin embargo, en la práctica
este caso no se da casi nunca y la mayoría de los casos son proporcionales a N•logN. Es
por ello que se tiliza esta última expresión para este método de ordenación.
Una definición rigurosa de esta notación es la siguiente:
Una función g(N) pertenece a O(f(N)) si y sólo si existen las constantes c0 y N0 tales
que:
g(N) <= c0•f(N) , para todo N >= N0.

Complejidad.

Un algoritmo es un conjunto finito de reglas que dan una secuencia de operaciones para
resolver todos los problemas de un tipo de dato, debe cumplir con condiciones de
finitud, definibilidad, entrada, salida y efectividad.

El uso de estructuras pueden hacer trivial el diseño de un algoritmo o un algoritmo muy


complejo puede usar estructuras de datos muy simples.

Tiempo De Ejecución De Un Algoritmo.

Período transcurrido entre el inicio y la finalización del algoritmo:

- Tiempo de ejecución constante. Significa que la mayoría de las instrucciones se


ejecutan una vez o muy pocas.

- logN. Tiempo de ejecución logarítmico. Se puede considerar como una gran constante.
La base del logaritmo (en informática la más común es la base 2) cambia la constante,
pero no demasiado. El programa es más lento cuanto más crezca N, pero es
inapreciable, pues logN no se duplica hasta que N llegue a N2.

- N. Tiempo de ejecución lineal. Un caso en el que N valga 40, tardará el doble que otro
en que N valga 20. Un ejemplo sería un algoritmo que lee N números enteros y
devuelve la media aritmética.

- N•logN. El tiempo de ejecución es N•logN. Es común encontrarlo en algoritmos como


Quick Sort y otros del estilo divide y vencerás. Si N se duplica, el tiempo de ejecución
es ligeramente mayor del doble.
- N2. Tiempo de ejecución cuadrático. Suele ser habitual cuando se tratan pares de
elementos de datos, como por ejemplo un bucle anidado doble. Si N se duplica, el
tiempo de ejecución aumenta cuatro veces. El peor caso de entrada del algoritmo Quick
Sort se ejecuta en este tiempo.

- N3. Tiempo de ejecución cúbico. Como ejemplo se puede dar el de un bucle anidado
triple. Si N se duplica, el tiempo de ejecución se multiplica por ocho.

- 2N. Tiempo de ejecución exponencial. No suelen ser muy útiles en la práctica por el
elevadísimo tiempo de ejecución. El problema de la mochila resuelto por un algoritmo
de fuerza bruta -simple vuelta atrás- es un ejemplo. Si N se duplica, el tiempo de
ejecución se eleva al cuadrado.

Complejidad En Espacio.

La cantidad (la medida varía según la máquina) que necesita el algoritmo para su
ejecución; es decir, el espacio en memoria que ocupan todas las variables propias al
algoritmo. Para calcular la memoria estática de un algoritmo se suma la memoria que
ocupan las variables declaradas en el algoritmo. Para el caso de la memoria dinámica, el
cálculo no es tan simple ya que, este depende de cada ejecución del algoritmo.

1.6. ESTRUCTURAS DE DATOS ESTADISTICAS Y DINAMICAS

Estructura de Datos Estaticas:


Son aquellas en las que el tamaño ocupado en memoria se define
antes de que el programa se ejecute y no puede modificarse dicho
tamaño durante la ejecución del programa.
Estas estructuras están implementadas en casi todos los
lenguajes.
Su principal característica es que ocupan solo una casilla de
memoria, por lo tanto una variable simple  hace referencia a un
único valor a la vez, dentro de este grupo  de datos se
encuentra:
a)Enteros
b)Reales
c)Caracteres
d)Boléanos
e)Enumerados
f)Subrangos
Nota:Los últimos no existen en algunos lenguajes de
programación.

Estructura de Datos Dinamicas:


No tienen las limitaciones o restricciones en el tamaño de
memoria ocupada que son propias de las estructuras estáticas.
Mediante el uso de un tipo de datos especifico, denominado
puntero, es posible construir estructuras de datos dinámicas que
no son soportadas por la mayoría de los lenguajes, pero que en
aquellos que si tienen estas características ofrecen soluciones
eficaces y efectivas en la solución de problemas complejos.
Se caracteriza por el hecho de que con un nombre se hace
referencia a un grupo de casillas de memoria. 
Es decir un dato estructurado tiene varios componentes.

CLASIFICACIÓN DE LAS ESTRUCTURAS DE DATOS:


ESTRUCTURAS DE DATOS ESTÁTICAS
   1.- Simples o primíticas
       a) Boolean
       b) Char
       c) Integer 
       d) Real
   2.- Compuestas
       a) Arreglos
       b) Conjuntos
       c) Strings
       d) Registros
       e) Archivos
ESTRUCTURA DE DATOS DINAMICAS
   1.- Lineales
       a) Pila
       b) Cola
       c) Lista
   2.- No lineales
       a) Árboles
       b) Grafos

2. RECURSIBILIDAD

2.1. INTRODUCCION

El área de la programación es muy amplia y con muchos detalles. Los programadores


necesitan ser capaces de resolver todos los problemas que se les presente a través del
computador aun cuando en el lenguaje que utilizan no haya una manera directa de
resolver los problemas. En el lenguaje de programación C, así como en otros lenguajes
de programación, se puede aplicar una técnica que se le dio el nombre de recursividad
por su funcionalidad. Esta técnica es utilizada en la programación estructurada para
resolver problemas que tengan que ver con el factorial de un número, o juegos de
lógica. Las asignaciones de memoria pueden ser dinámicas o estáticas y hay diferencias
entre estas dos y se pueden aplicar las dos en un programa cualquiera.

2.2 VENTAJA Y DESVENTAJAS

Ventajas:
         No es necesario definir la secuencia de pasos exacta para resolver el problema.
         Soluciones simples, claras.
         Soluciones elegantes.
         Soluciones a problemas complejos.
Desventajas:
         Podría ser menos eficiente.
         Sobrecarga asociada con las llamadas a subalgoritmos
         Una simple llamada puede generar un gran número de llamadas Recursivas. (Fact(n)
genera n llamadas recursivas)
         El valor de la recursividad reside en el hecho de que se puede usar para resolver
problemas sin fácil solución iterativa.
         La ineficiencia inherente de algunos algoritmos recursivos.

2.3. PLAMTEAMIENTO Y SOLUICION DE PROBLEMAS


ESTRUCTURA DE DATOS DINAMICOS

No tienen las limitaciones o restricciones en el tamaño de


memoria ocupada que son propias de las estructuras
estáticas.
Mediante el uso de un tipo de datos especifico,
denominado puntero, es posible construir estructuras de
datos dinámicas que no son soportadas por la mayoría de
los lenguajes, pero que en aquellos que si tienen estas
características ofrecen soluciones eficaces y efectivas en
la solución de problemas complejos.
Se caracteriza por el hecho de que con un nombre se hace
referencia a un grupo de casillas de memoria. Es decir un
dato estructurado tiene varios componentes.
5.1. LISTAS

5.1.1. INTRODUCCION

Introducción

La lista enlazada es un TDA que nos permite almacenar datos de una forma organizada,
al igual que los vectores pero, a diferencia de estos, esta estructura es dinámica, por lo
que no tenemos que saber "a priori" los elementos que puede contener.
En una lista enlazada, cada elemento apunta al siguiente excepto el último que no tiene
sucesor y el valor del enlace es null. Por ello los elementos son registros que contienen
el dato a almacenar y un enlace al siguiente elemento. Los elementos de una lista,
suelen recibir también el nombre de nodos de la lista.

struct lista {
gint dato;
lista *siguiente;
};

Representa el dato a almacenar. Puede ser de cualquier tipo; en este ejemplo se trata
de una lista de enteros.

Es un puntero al siguiente elemento de la lista; con este puntero enlazamos con el


sucesor, de forma que podamos construir la lista.

Figura 1. Esquema de un nodo y una lista enlazada.

Para que esta estructura sea un TDA lista enlazada, debe tener unos operadores
asociados que permitan la manipulación de los datos que contiene. Los operadores
básicos de una lista enlazada son:

 Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta inserción
al principio o final de la lista o bien en orden.
 Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato.

 Buscar: busca un elemento en la lista.

 Localizar: obtiene la posición del nodo en la lista.

 Vaciar: borra todos los elementos de la lista

Después de esta breve introducción, que sólo pretende servir como recordatorio,
pasaremos a ver cómo es la estructura GSList que, junto con el conjunto de funciones
que la acompañan, forman el TDA lista enlazada en GLib™.
5.1.2 LISTAS

una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada
para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los
que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros
al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los
vectores convencionales es que el orden de los elementos enlazados puede ser diferente
al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de
recorrido de la lista sea diferente al de almacenamiento.

Una lista enlazada es un tipo de dato autorreferenciado porque contienen un puntero o


enlace (en inglés link, del mismo significado) a otro dato del mismo tipo. Las listas
enlazadas permiten inserciones y eliminación de nodos en cualquier punto de la lista en
tiempo constante (suponiendo que dicho punto está previamente identificado o
localizado), pero no permiten un acceso aleatorio. Existen diferentes tipos de listas
enlazadas: listas enlazadas simples, listas doblemente enlazadas, listas enlazadas
circulares y listas enlazadas doblemente circulares.

Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales
como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones
para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales
como C o C++ y Java, respectivamente, disponen de referencias para crear listas
enlazadas.

5.1.3. LISTAS ENLAZADAS

Una lista enlazada es un conjunto de elementos llamados nodos en los que cada uno de
ellos contiene un dato y también la dirección del siguiente nodo.
El primer elemento de la lista es la cabecera, que sólo contiene un puntero que señala el
primer elemento de la lista.
El último nodo de la lista apunta a NULL (nulo) porque no hay más nodos en la lista. Se
usará el término NULL para designar el final de la lista.

La lista enlazada se muestra en la siguiente figura:

Cabecera
Las operaciones que normalmente se ejecutan con listas incluyen:

1. Recuperar información de un nodo específico.


2. Encontrar el nodo que contiene una información específica.
3. Insertar un nuevo nodo en un lugar específico.
4. Insertar un nuevo nodo en relación a una información particular.
5. Borrar un nodo existente.

Lo que realmente hace de los punteros una herramienta potente es la circunstancia de


que pueden apuntar a variables que a su vez contienen punteros (Ejemplo, registros en
los que uno de sus campos es a su vez un puntero).
Ejemplo: Se desarrollará mediante punteros el tratamiento de la agenda que introdujo en
la problemática de las variables estáticas/dinámicas. A continuación se definen los tipos
y las variables:

Si se desplegase la agenda de forma lineal se tendría lo siguiente:

A este tipo de estructuras se les denomina Lista Enlazada y a cada uno de los registros
que forman la misma se le denomina nodo. En general, un nodo de una lista enlazada
puede contener toda la información que se desee (todos los campos que se quieran), más
un campo de tipo Puntero, que apuntará al siguiente registro.

5.1.4. REPRESENTACION DE UNA LISTA ENLAZADA

Representa el dato a almacenar. Puede ser de cualquier tipo; en este ejemplo se trata de
una lista de enteros.

Es un puntero al siguiente elemento de la lista; con este puntero enlazamos con el


sucesor, de forma que podamos construir la lista.

Para que esta estructura sea un TDA lista enlazada, debe tener unos operadores
asociados que permitan la manipulación de los datos que contiene. Los operadores
básicos de una lista enlazada son:

Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta inserción al
principio o final de la lista o bien en orden.
Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato.

Buscar: busca un elemento en la lista.

Localizar: obtiene la posición del nodo en la lista.

Vaciar: borra todos los elementos de la lista

5.1.5 RECORRIDO

reconocer un vector fue fácil con una estructura repetitiva , al poder utilizar su índice para
poder ir del principio al final de la estructura . sin embargo en el cargo de las listas , al carecer
de índice , puede pensarse que no es tan fácil acceder directa o aleatoriamente a sus nodos ,
ya para ello es necesario acceder al primer nodo mediante el pun tero externo , al segundo ,
después de ascender al primero , etc .afortunadamente , esto se resuelve , usando una
variable puntero , auxiliar x , que aun te en cada momento al no so procesado , de forma
que . con solo hacer asignación :X – sig.(x), esto es guardar en x el campo puntero del nodo
se tiene el efecto de avanzar hacia el siguiente nodo de la lista.

Basandonos en los anteriores , el recorrido de una lista , es posible utilizando el puntero


temporal P. Asi siguiente algoritmo, nos permite leer lista completa.

El puntero P contiene el valor del primer elemento de la lista . el bucle recorre toda la lista
hasta que escuentra un nodo cuyo siguiente sea nulo, en cuyo caso se efectuaría
(P←NULO), que corresponde al ultimo de la lista.La línea 4 escribe el valor de cvada
elemento y la línea 5 avanza el puntero P, dándole el valor dell campo IG del nodo actual.

5.1.6. Busqueda

Buscando un elemento específico en una lista enlazada, incluso si esta es ordenada,


normalmente requieren tiempo O (n) (búsqueda lineal). Esta es una de las principales
desventajas de listas enlazadas respecto a otras estructuras. Además algunas de las
variantes expuestas en la sección anterior, hay numerosas vías simples para mejorar el
tiempo de búsqueda.
En una lista desordenada, una forma simple para decrementar el tiempo de búsqueda
medio es el mover al frente de forma heurística, que simplemente mueve un elemento al
principio de la lista una vez que es encontrado. Esta idea, útil para crear cachés simples,
asegura que el ítem usado más recientemente es también el más rápido en ser
encontrado otra vez.

Otro enfoque común es indizar una lista enlazada usando una estructura de datos
externa más eficiente. Por ejemplo, podemos construir un árbol rojo-negro o una tabla
hash cuyos elementos están referenciados por los nodos de las listas enlazadas. Pueden
ser construidos múltiples índices en una lista simple. La desventaja es que estos índices
puede necesitar ser actualizados cada vez que uno nodo es añadido o eliminado (o al
menos, antes que el índice sea utilizado otra vez).

Para implementar la operación get se usa el patrón de recorrido de la lista enlazada. Al


hacer la búsqueda de la llave no se necesita visitar el eslabón falso por lo tanto el
recorrido de los eslabones comienza por el segundo eslabón:
String getString(int llave) {
EslabonM e= primero.proximo;
while (e!=null) {
if (e.llave==llave)
return e.val;
e= e.proximo;
}
fatalError("No se encontro la llave "+i); // termina la
ejecución!
return null; // para que pase la compilacion
}
La búsqueda termina cuando se encuentra la llave especifica o cuando se acaba la lista
enlazada. En este último caso el programa termina con un mensaje de error.

También se necesita hacer este mismo recorrido con la operación put. Si la llave existe
se modifica el valor en el mismo eslabón. Si la llave no existía previamente en la lista
enlazada, se crea un nuevo eslabón para esa llave y se agrega por conveniencia justo
después del eslabón falso:

void put(int llave, String val) {


EslabonM e= primero.proximo;
while (e!=null) {
if (e.llave==llave) { // la llave existe
e.val= val; // cambiamos su valor
return; // y retornamos
}
e= e.proximo;
}
// la llave no existía previamente
// Creamos un nuevo eslabon y lo agregamos entre el eslabon
// falso y el segundo eslabon
e= new EslabonM(llave, val, primero.proximo);
primero.proximo= e;
}
La siguiente figura muestra el caso en que la llave ya existía previamente en el arreglo
asociativo:
5.1.7 disposicion en la memoria

En ciencia de la computación, asignación dinámica de la memoria es la asignación de


almacenamiento de memoria para utilización por parte de un programa de computador
durante el tiempo de ejecución de ese programa. Es una manera de distribuir la propiedad de
recursos de memoria limitada entre muchas piezas de código y datos. Un objeto asignado
dinámicamente permanece asignado hasta que es desasignado explícitamente, o por el
programador o por un recolector de basura; esto es notablemente diferente de la asignación
automática de memoria y de la asignación estática de memoria (la de las variables estáticas).
Se dice que tal objeto tiene tiempo de vida dinámico.

5.1.8. inserción

 El nodo debe insertarse antes del primer nodo:.


Se crea un Node, se inicialia su campo no de enlace, se asigna la referencia de
top al campo de enlace next, y se asigna la referencia del Node recien creado a
top. El siguiente pseudocódigo (que asume que se ha ejecutado el pseudocódigo
anterior) realiza estas tareas:
 DECLARE Node temp

 temp = NEW Node
 temp.name = "B"
 temp.next = top
 top = temp

El resultado del listado anterior aparece en la siguiente imagen:

 El nodo debe insertarse detrás del último nodo:


Se crea un Node, se inicializa su campo no de enlace, se asigna NULL al campo de
enlace, se atraviesa la lista de enlace simple hasta el último Node, y se asigna la
referencia del Node recien creado al campo next del último nodo. El siguiente
pseudocódigo realiza estas tareas:
 temp = NEW Node
 temp.name = "C"
 temp.next = NULL

 DECLARE Node temp2

 temp2 = top

 // We assume top (and temp2) are not NULL
 // because of the previous pseudocode

 WHILE temp2.next IS NOT NULL
 temp2 = temp2.next
 END WHILE

 // temp2 now references the last node

 temp2.next = temp

La siguiente imagen revela la lista después de la inserceción del nodo C después


del nodo A.

 El nodo se debe insertar entre dos nodos:


Este es el caso más complejo. Se crea un Node, se inicializa su campo no de
enlace, se atraviesa la lista hasta encontrar el Node que aparece antes del nuevo
Node, se asigna el campo de enlace del Node anterior al campo de enlace del
Node recien creado, y se asigna la referencia del Node recien creado al campo del
enlace del Node anterior. El siguiente pseudocódigo realiza estas tareas:
 temp = NEW Node
 temp.name = "D"

 temp2 = top

 // We assume that the newly created Node is inserted after Node
 // A and that Node A exists. In the real world, there is no
 // guarantee that any Node exists, so we would need to check
 // for temp2 containing NULL in both the WHILE loop's header
 // and after the WHILE loop completes.

 WHILE temp2.name IS NOT "A"
 temp2 = temp2.next
 END WHILE

 // temp2 now references Node A.

 temp.next = temp2.next
 temp2.next = temp

La siguiente imagen muestra la inserción del nodo D entre los nodos A y C.


El siguiente listado presenta el equivalente Java de los ejemplos de pseudocódigo de
insercción anteriores:

// SLLInsDemo.java

class SLLInsDemo {
static class Node {
String name;
Node next;
}

public static void main (String [] args) {


Node top = null;

// 1. The singly linked list does not exist

top = new Node ();


top.name = "A";
top.next = null;

dump ("Case 1", top);

// 2. The singly linked list exists, and the node must be


inserted
// before the first node

Node temp;

temp = new Node ();


temp.name = "B";
temp.next = top;
top = temp;

dump ("Case 2", top);

// 3. The singly linked list exists, and the node must be


inserted
// after the last node

temp = new Node ();


temp.name = "C";
temp.next = null;

Node temp2;

temp2 = top;

while (temp2.next != null)


temp2 = temp2.next;

temp2.next = temp;

dump ("Case 3", top);


// 4. The singly linked list exists, and the node must be
inserted
// between two nodes

temp = new Node ();


temp.name = "D";

temp2 = top;

while (temp2.name.equals ("A") == false)


temp2 = temp2.next;

temp.next = temp2.next;
temp2.next = temp;

dump ("Case 4", top);


}

static void dump (String msg, Node topNode) {


System.out.print (msg + " ");

while (topNode != null) {


System.out.print (topNode.name + " ");
topNode = topNode.next;
}
System.out.println ();
}
}

El método static void dump(String msg, Node topNode) itera sobre la lista e
imprime su contenido. Cuando se ejecuta SLLInsDemo, las repetidas llamadas a este
método dan como resultado la siguiente salida, lo que coincide con las imagénes
anteriores:

Case 1 A
Case 2 B A
Case 3 B A C
Case 4 B A D C

5.1.9 eliminacion

Esta operación consiste en hacer que el nodo anterior , al nodo que quiere eliminaRSE , se
enlace con el posterior a este , con lo cual el nodo que nos in teresa quedara fuera de la
lista . consideremos la lista enlazada . el Algoritmo que sigue eliminada de la lñiosta
enlazada el elemento siguien te al apuntado por p , utilizando un pun tero axiliar q:
no tenemos que a su vez , el proceso de borrado dara lugar a la existencia de nodos libres o
disponibles , al liberar el nodo que se elimina ; este espacio de memoria podra ser utilizado.

5.1.10. listas con cabeceras

Estas pueden ser simples o doblemente enlazadas. En una lista circular todos los nodos están
enlazados como un círculo, sin usar nulo. Para listas con frente y final (como una cola), se
guarda una referencia al último nodo de la lista. El siguiente nodo después del último sería el
primero de la lista. Los elementos se pueden añadir por el final y borrarse por el principio en
todo momento. Ambos tipos de listas circulares tienen la ventaja de poderse recorrer
completamente empezando desde cualquier nodo. Esto nos permite normalmente evitar el
uso de PrimerNodo y UltimoNodo, aunque si la lista estuviera vacía necesitaríamos un caso
especial, como una variables UltimoNodo que apunte a algún nodo en la lista o nulo si está
vacía. Las operaciones para estas listas simplifican el insertar y borrar nodos en una lista vacía
pero introducen casos especiales en la lista vacía.

Listas enlazadas doblemente circulares

Asumiendo que someNodo es algún nodo en una lista no vacía, esta lista presenta el
comienzo de una lista con someNode.

Hacia Delante

node := someNode
do
do something with node.value
node := node.next
while node != someNode

Hacia Atrás

node := someNode
do
do something with node.value
node := node.prev
while node := someNode

Esta función inserta un nodo en una lista enlazada doblemente circular después de un
elemento dado:

function insertAfter(Node node, Node newNode)


newNode.next := node.next
newNode.prev := node
node.next.prev := newNode
node.next := newNode

Para hacer "insertBefore", podemos simplificar "insertAfter (node.prev, newNode)".


Insertar un elemento en una lista que puede estar vacía requiere una función especial.

function insertEnd(List list, Node node)


if list.lastNode = null
node.prev := node
node.next := node
else
insertAfter (list.lastNode, node)
list.lastNode := node

Para insertar al principio simplificamos "insertAfter (list.lastNode, node)".

function remove(List list, Node node)


if node.next = node
list.lastNode := null
else
node.next.prev := node.prev
node.prev.next := node.next
if node = list.lastNode
list.lastNode := node.prev;
destroy node

Como una lista doblemente enlazada, "removeAfter" y "removeBefore" puede ser


implementada con "remove (list, node.prev)" y "remove (list, node.next)".

5.1.11. listas dobles

Una lista doblemente enlazada es una lista enlazada de nodos, donde cada nodo tiene un par
de campos de enlace. Un campo de enlace permite atravesar la lista hacia adelante, mientras
que el otro permite atravesar la lista haca atrás. Para la dirección hacia adelante, una variable
de referencia contiene una referencia al primer nodo. Cada nodo se enlaza con el siguiente
mediante el campo de enlace next, excepto el último nodo, cuyo campo de
enlace nextcontiene null para indicar el final de la lista (en direccion hacia adelante). De
forma similar, para la dirección contraria, una variable de referencia contiene una referencia al
último nodo de la dirección normal (hacia adelante), lo que se interpreta como el primer nodo.
Cada nodo se enlaza con el anterior mediante el campo de enlace previous, y el primer nodo
de la direccion hacia adelante, contiene null en su campo previous para indicar el fin de la
lista. La siguiente figura representa una lista doblemente enlazada de tres nodos,
donde topForward referencia el primer nodo en la direccion hacia adelante, y topBackward
referencia el primero nodo la dirección inversa.

5.2 arboles

En ciencias de la informática, un árbol es una estructura de datos ampliamente usada 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 cero o más nodos hijos conectados a él. Se dice que un
nodo es padre de un nodo si existe un enlace desde hasta (en ese caso, también
decimos que es hijo de ). Sólo puede haber un único nodo sin padres, que llamaremos raíz.
Un nodo que no tiene hijos se conoce como hoja. Los demás nodos (tienen padre y uno o
varios hijos) se les conoce como rama.

5.2.1. introduccion

A los arboles ordenados de grado dos se les conoce como arboles binarios ya que cada
nodo del árbol no tendrá más de dos descendientes directos. Las aplicaciones de los
arboles binarios son muy variadas ya que se les puede utilizar para representar una
estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos.

La representación gráfica de un árbol binario es la siguiente:


5.2.2 arboles binarios

Los árboles de grado 2 tienen una especial importancia. Se les conoce con el nombre de
árboles binarios. Se define un árbol binario como un conjunto finito de elementos
(nodos) que bien está vació o está formado por una raíz con dos árboles binarios
disjuntos, llamados subárbol izquierdo y derecho de la raíz.
En los apartados que siguen se considerarán únicamente árboles binarios y, por lo tanto,
se utilizará la palabra árbol para referirse a árbol binario. Los árboles de grado superior
a 2 reciben el nombre de árboles multicamino.
Árbol binario de búsqueda.- Los árboles binarios se utilizan frecuentemente para
representar conjuntos de datos cuyos elementos se identifican por una clave única. Si el
árbol está organizado de tal manera que la clave de cada nodo es mayor que todas las
claves su subárbol izquierdo, y menor que todas las claves del subárbol derecho se dice
que este árbol es un árbol binario de búsqueda.

Ejemplo:

Operaciones básicas.- Una tarea muy común a realizar con un árbol es ejecutar una
determinada operación con cada uno de los elementos del árbol.Esta operación se
considera entonces como un parámetro de una taré más general que es la visita de todos
los nodos o, como se denomina usualmente, del recorrido del árbol.
Si se considera la tarea como un proceso secuencial, entonces los nodos individuales se
visitan en un orden específico, y pueden considerarse como organizados según una
estructura lineal. De hecho, se simplifica considerablemente la descripción de muchos
algoritmos si puede hablarse del proceso del siguiente elemento en el árbol, según un
cierto orden subyacente.
Hay dos formas básicas de recorrer un árbol: El recorrido en amplitud y el recorrido en
profundidad.
Recorrido en amplitud.- Es aquel recorrido que recorre el árbol por niveles, en el último
ejemplo sería:
12 - 8,17 - 5,9,15
Recorrido en profundidad.- Recorre el árbol por subárboles. Hay tres formas: Preorden,
orden central y postorden.
Preorden: Raiz, subárbol izquierdo y subárbol derecho.
Orden central: Subarbol izquierdo, raiz, subarbol derecho.
Postorden: Subarbol izquierdo, subarbol derecho, raiz.

Ejemplo:
Preorden: 20 - 12 - 5 - 2 - 7 - 13 - 15 - 40 - 30 - 35 - 47
Orden central: 2 - 5 - 7 - 12 - 13 - 15 - 20 - 30 - 35 - 40 - 47
Postorden: 2 - 7 - 5 - 15 - 13 - 12 - 35 - 30 - 47 - 40 - 20
Ejemplo:
Preorden: / + a b * c d Notación polaca
Orden central: a + b / c * d Notación infija
Postorden: a b + c d * / Notación polaca inversa

5.2.3. repreentacion de arboles binario en memoria

Hay dos formas tradicionales de representar un árbol binario en memoria:

 Por medio de datos tipo punteros también conocidos como variables dinámicas o
listas.
 Por medio de arreglos.

Sin embargo la más utilizada es la primera, puesto que es la más natural para tratar este
tipo de estructuras.

Los nodos del árbol binario serán representados como registros que contendrán como
mínimo tres campos. En un campo se almacenará la información del nodo. Los dos
restantes se utilizarán para apuntar al subarbol izquierdo y derecho del subarbol en
cuestión.

Cada nodo se representa gráficamente de la siguiente manera:

El algoritmo de creación de un árbol binario es el siguiente:


Procedimiento crear(q:nodo)

inicio

mensaje("Rama izquierda?")

lee(respuesta)

si respuesta = "si" entonces

new(p)

q(li) <-- nil

crear(p)

en caso contrario

q(li) <-- nil

mensaje("Rama derecha?")

lee(respuesta)

si respuesta="si" entonces

new(p)

q(ld)<--p

crear(p)

en caso contrario

q(ld) <--nil

fin

INICIO

new(p)

raiz<--p

crear(p)

FIN

5.2.4 recorrido
Hay tres manera de recorrer un árbol : en inorden, preorden y postorden. Cada una de
ellas tiene una secuencia distinta para analizar el árbol como se puede ver a
continuación:

 INORDEN

 Recorrer el subarbol izquierdo en inorden.


 Examinar la raíz.
 Recorrer el subarbol derecho en inorden.

 PREORDEN

 Examinar la raíz.
 Recorrer el subarbol izquierdo en preorden.
 recorrer el subarbol derecho en preorden.

 POSTORDEN

 Recorrer el subarbol izquierdo en postorden.


 Recorrer el subarbol derecho en postorden.
 Examinar la raíz.

A continuación se muestra un ejemplo de los diferentes recorridos en un árbol binario.

Inorden: GDBHEIACJKF

Preorden: ABDGEHICFJK

Postorden: GDHIEBKJFCA

5.2.5. algoritmo de recorrido usando pilas


Los Árboles tiene 3 Recorridos Diferentes los cuales son:

 Pre-Orden
 In-Orden
 Post-Orden

Suponga un árbol binario T mantenido en memoria por una representación


enlazada.
ÁRBOL (INFO, IZQ, DER, RAIZ)
Esta sección discute la implementación de los tres recorridos estándar de T,
definidos recursivamente en la última sección, mediante procedimientos no
recursivos que usan pilas.
Recorrido reorden:
El orden del recorrido preorden usa una variable PTR (puntero) que contendrá
la posición del nodo N que se está examinando. Esto se en la figura 7-15,
donde L(N) denota al hijo izquierdo del nodo N y R(N) denotado al hijo derecho.
El algoritmo también usa un array pila, que contendrá las direcciones de los
nodos que hayan de ser procesados. 

Recorrido de un árbol: visita de cada


elemento del árbol una
sola vez.
•Recorrido en amplitud (por niveles)
•Recorrido en profundidad: IRD
Inorden IRD
Preorden RID
Postorden IDR
Visitar la raíz
Recorrer en preorden el subárbol
izquierdo
Recorrer en preorden el subárbol
derecho
procedimiento preorden (a:arbol-
binario)
Si no esvacioAB(a) entonces
proceso(raizAB(a));
preorden(izqAB(a));
preorden(derAB(a))
fsi
fprocedimiento

Recorrer en inorden el subárbol


izquierdo
Visitar la raíz
Recorrer en inorden el subárbol
derecho
procedimiento inorden (a:arbol-
binario)
Si no esvacioAB(a) entonces
inorden(izqAB(a));
proceso(raizAB(a));
inorden(derAB(a))
fsi
fprocedimiento

Recorrer en postorden el subárbol


izquierdo
Recorrer en postorden el subárbol
derecho
Visitar la raíz
procedimiento postorden (a:arbol-
binario)
Si no esvacioAB(a) entonces
postorden(izqAB(a));
postorden(derAB(a));
proceso(raizAB(a));
fsi
fprocedimiento

Tipo Arbol=^Nodo;
Tipo Nodo=registro
info:Tinfo;
izq,der:Arbol;
freg
Variables globales:
a:Arbol;
p:Pila(Arbol);
PreOrden_I(a:Arbol);
Creap(p);
Si a<>nil entonces Apilar (p,a);
Mientras no esvacia(p) hacer
aux:=Tope(p);
desapilar(p);
Tratar(aux^.info);
Si aux^.der<>Nil entonces apilar(p,aux^.der);
Si aux^.izq<>Nil entonces apilar(p,aux^.izq);
fMientras

5.2.6 nodos cabeceras


Suponga un árbol binario T dispuesto en memoria por representación
enlazada. A veces se añade al principio de T un nodo extra, especial, llamada
nodo cabecera. Cuando se usa este nodo extra, la variable puntero el árbol,
que llamaremos CABEZA (en lugar de raíz), apuntara al nodo cabecera, el
puntero izquierdo del nodo cabecera apuntara a la raíz de T.

Hebras; enhebrado inorden

Considere de nuevo la representación enlazada de un árbol binario T.


aproximadamente la mitad de las entradas de los campo puntero IZQ y DER
contendrá valores nulos. Este espacio se puede aprovechar más
eficientemente reemplazados las entradas nulas por algún otro tipo de
información. Específicamente, reemplazaremos ciertas entradas nulas con
punteros especiales que apuntaran a nodos supriores de árbol. Estos punteros
especiales se llaman hebras, y los árboles binarios con este tipo de punteros se
llaman árboles enhebrados.
Las hebras de un árbol enhebrado se deben distinguir de alguna forma de los
punteros normales. Las hebras en los diagramas de un árbol enhebrado se
indican normalmente con las líneas discontinuas. En la memoria de la
computadora se pude usar un campo extra INDICADOR de un bit para
distinguir las hebras de los punteros ordinarios, o, alternativamente, denotar las
hebras por enteros negativos y los punteros normales por enteros positivos.

5.2.7 arboles binarios de búsqueda

Para todo nodo A del árbol:

 Todos los valores de los nodos del subárbol izquierdo de A deben ser menores al valor
del nodo A.
 Todos los valores de los nodos del subárbol derecho de A deben ser mayores o iguales
al valor del nodo A. Un recorrido en inorden del árbol proporciona una lista en orden
ascendente de los valores almacenados en los nodos. Para describir las operaciones, se
considera que estas se enmarcan dentro de la clase NodoBinario. El lenguaje utilizado
es JAVA.

Operación “buscar”
public boolean buscar(Object o)
{
if (o.equals(valor))
return true;
else if (o.compareTo(valor)<0)
return buscar(getIzq(),o);
else return buscar(getDer(),o);
}

Operación “insertar”
public NodoBinario insertar(Comparable o){
if (o.compareTo(valor)<0)
setIzq(insertar(getIzq(),o));
else setDer(insertar(getDer(),o));
return this;
}

Dentro de la clase NodoBinarioVacio:

public NodoBinario insertar(Comparable o)


{
return new NodoBinario(o);
}

Operación “recorrer”

Los recorridos pueden ser en preorden, postorden o inorden (orden simétrico). Todos
son O(N).

public void preOrder(SList aList)


{
aList.addElement(value);
left.preOrder(aList);
right.preOrder(aList);
}
public void inOrder(SList aList)
{
left.inOrder(aList);
aList.addElement(value);
right.inOrder(aList);
}
public void posOrder(SList aList)
{
left.posOrder(aList);
right.posOrder(aList);
aList.addElement(value);
}

Los recorridos no necesitan obligatoriamente recursividad, se puede emplear una pila


para realizarlos iterativamente.

Operación “borrado”

El nodo a borrar debe ser reemplazado por el nodo más a la derecha en el subárbol
izquierdo o el nodo más a la izquierda en el subárbol derecho (el nodo más a la derecha
del subárbol izquierdo será mayor o igual que cualquier otro nodo de ese subárbol y
menor que todos los del subárbol derecho, y el nodo más a la izquierda del subárbol
derecho será menor que todos los demás nodos de ese subárbol y mayor que todos los
del subárbol izquierdo). Para el caso en el que el nodo elegido tengo un subárbol, hay
por lo menos tres soluciones posibles:

 La primera consiste en conservar la estructura del subárbol, y colgar del elemento


ubicado en el extremo (el elemento menor o mayor) correspondiente al subárbol
donde se encuentra el elemento a promover hacia la raíz (en este ejemplo, el subárbol
izquierdo, por lo cual se buscará el elemento más a la izquierda), lo cual es consistente,
porque todos los elementos en el subárbol promovido serán mayores que los del
subárbol del cual estaban colgados a la derecha. El inconveniente que presenta esta
solución es que debe utilizarse una función encontrarMínimo() o encontrarMáximo().
 La segunda solución consiste en colgar del padre del nodo promovido hacia la raíz, el
subárbol remanente. Esto es consistente, porque todo elemento del subárbol derecho
de un nodo será mayor que el valor de ese nodo, y viceversa. Estas soluciones
aprovechan la ventaja de contar con que el nodo promovido tiene, a lo sumo, un
subárbol.

 Un hueco dejado por un nodo promovido también puede pensarse como una
eliminación. un arbol es un arbol jajaja

5.2.8 búsqueda de inserción en arboles binarios

Buscar un elemento 

Partiendo siempre del nodo raíz, el modo de buscar un elemento se define de forma
recursiva.

 Si el árbol está vacío, terminamos la búsqueda: el elemento no está en el árbol.


 Si el valor del nodo raíz es igual que el del elemento que buscamos, terminamos
la búsqueda con éxito.
 Si el valor del nodo raíz es mayor que el elemento que buscamos, continuaremos
la búsqueda en el árbol izquierdo.
 Si el valor del nodo raíz es menor que el elemento que buscamos, continuaremos
la búsqueda en el árbol derecho.

El valor de retorno de una función de búsqueda en un ABB puede ser un puntero al


nodo encontrado, o NULL, si no se ha encontrado.

Insertar un elemento

Para insertar un elemento nos basamos en el algoritmo de búsqueda. Si el elemento está


en el árbol no lo insertaremos. Si no lo está, lo insertaremos a continuación del último
nodo visitado.

Necesitamos un puntero auxiliar para conservar una referencia al padre del nodo raíz
actual. El valor inicial para ese puntero es NULL.

 Padre = NULL
 nodo = Raiz
 Bucle: mientras actual no sea un árbol vacío o hasta que se encuentre el
elemento.

 Si el valor del nodo raíz es mayor que el elemento que buscamos, continuaremos
la búsqueda en el árbol izquierdo: Padre=nodo, nodo=nodo->izquierdo.
 Si el valor del nodo raíz es menor que el elemento que buscamos, continuaremos
la búsqueda en el árbol derecho: Padre=nodo, nodo=nodo->derecho.

 Si nodo no es NULL, el elemento está en el árbol, por lo tanto salimos.


 Si Padre es NULL, el árbol estaba vacío, por lo tanto, el nuevo árbol sólo
contendrá el nuevo elemento, que será la raíz del árbol.
 Si el elemento es menor que el Padre, entonces insertamos el nuevo elemento
como un nuevo árbol izquierdo de Padre.
 Si el elemento es mayor que el Padre, entonces insertamos el nuevo elemento
como un nuevo árbol derecho de Padre.

Este modo de actuar asegura que el árbol sigue siendo ABB.

5.2.9. eliminación

La eliminación de un elemento es directa si no se requiere corrección para garantizar sus


propiedades. Hay dos estrategias populares para eliminar un nodo de un árbol B.

 localizar y eliminar el elemento, y luego corregir, o


 hacer una única pasada de arriba a abajo por el árbol, pero cada vez que se visita un
nodo, reestructurar el árbol para que cuando se encuentre el elemento a ser borrado,
pueda eliminarse sin necesidad de continuar reestructurando

Se pueden dar dos problemas al eliminar elementos: primero, el elemento puede ser un
separador de un nodo interno. Segundo, puede suceder que al borrar el elemento número
de elementos del nodo quede debajo de la cota mínima. Estos problemas se tratan a
continuación en orden.

Eliminación en un nodo hoja[editar · editar código]


 Busque el valor a eliminar.
 Si el valor se encuentra en un nodo hoja, se elimina directamente la clave,
posiblemente dejándolo con muy pocos elementos; por lo que se requerirán cambios
adicionales en el árbol.
eliminar clave 20 de un nodo interno.

Eliminación en un nodo interno[editar · editar código]

(recursivamente) del nuevo nodillo.

En el segundo caso, uno de los dos nodos hijos tienen un número de elementos mayor
que el mínimo. Entonces izquierdo o el menor elemento de el nuevo separador.

 Como se ha eliminado un elemento de un nodo hoja, se tar este caso de manera


equivalente.

Para borrar un elemento también nos basamos en el algoritmo de búsqueda. Si el


elemento no está en el árbol no lo podremos borrar. Si está, hay dos casos posibles:

 Se trata de un nodo hoja: en ese caso lo borraremos directamente.


 Se trata de un nodo rama: en ese caso no podemos eliminarlo, puesto que
perderíamos todos los elementos del árbol de que el nodo actual es padre. En su
lugar buscamos el nodo más a la izquierda del subárbol derecho, o el más a la
derecha del subárbol izquierdo e intercambiamos sus valores. A continuación
eliminamos el nodo hoja.

Necesitamos un puntero auxiliar para conservar una referencia al padre del nodo raíz
actual. El valor inicial para ese puntero es NULL.

 Padre = NULL
 Si el árbol está vacío: el elemento no está en el árbol, por lo tanto salimos sin
eliminar ningún elemento.
 (1) Si el valor del nodo raíz es igual que el del elemento que buscamos, estamos
ante uno de los siguientes casos:

 El nodo raíz es un nodo hoja:

 Si 'Padre' es NULL, el nodo raíz es el único del árbol, por lo tanto el puntero al
árbol debe ser NULL.
 Si raíz es la rama derecha de 'Padre', hacemos que esa rama apunte a NULL.
 Si raíz es la rama izquierda de 'Padre', hacemos que esa rama apunte a NULL.
 Eliminamos el nodo, y salimos.

 El nodo no es un nodo hoja:

 Buscamos el 'nodo' más a la izquierda del árbol derecho de raíz o el más a la


derecha del árbol izquierdo. Hay que tener en cuenta que puede que sólo exista
uno de esos árboles. Al mismo tiempo, actualizamos 'Padre' para que apunte al
padre de 'nodo'.
 Intercambiamos los elementos de los nodos raíz y 'nodo'.
 Borramos el nodo 'nodo'. Esto significa volver a (1), ya que puede suceder que
'nodo' no sea un nodo hoja. (Ver ejemplo 3)

 Si el valor del nodo raíz es mayor que el elemento que buscamos, continuaremos
la búsqueda en el árbol izquierdo.
 Si el valor del nodo raíz es menor que el elemento que buscamos, continuaremos
la búsqueda en el árbol derecho.

Ejemplo 1: Borrar un nodo hoja

En el árbol de ejemplo, borrar el nodo 3.

 Localizamos el nodo a borrar, al tiempo que mantenemos un puntero a 'Padre'.


 Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL.
 Borramos el 'nodo'.
Ejemplo 2:

Borrar un nodo rama con intercambio de un nodo hoja.

En el árbol de ejemplo, borrar el nodo 4.

 Localizamos el nodo a borrar ('raíz').


 Buscamos el nodo más a la derecha del árbol izquierdo de 'raíz', en este caso el
3, al tiempo que mantenemos un puntero a 'Padre' a 'nodo'.
 Intercambiamos los elementos 3 y 4.
 Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL.
 Borramos el 'nodo'.

Ejemplo 3:

Borrar un nodo rama con intercambio de un nodo rama.

Para este ejemplo usaremos otro árbol. En éste borraremos el elemento 6.


 Localizamos el nodo a borrar ('raíz').
 Buscamos el nodo más a la izquierda del árbol derecho de 'raíz', en este caso el
12, ya que el árbol derecho no tiene nodos a su izquierda, si optamos por la rama
izquierda, estaremos en un caso análogo. Al mismo tiempo que mantenemos un
puntero a 'Padre' a 'nodo'.
 Intercambiamos los elementos 6 y 12.
 Ahora tenemos que repetir el bucle para el nodo 6 de nuevo, ya que no podemos
eliminarlo.

 Localizamos de nuevo el nodo a borrar ('raíz').


 Buscamos el nodo más a la izquierda del árbol derecho de 'raíz', en este caso el
16, al mismo tiempo que mantenemos un puntero a 'Padre' a 'nodo'.
 Intercambiamos los elementos 6 y 16.
 Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL.
 Borramos el 'nodo'.
Este modo de actuar asegura que el árbol sigue siendo ABB.

5.2.10 arboles generales

Una forma de generar todos los árboles posibles es usando recursión.


Dados una serie de árboles T0; T1; : : : ; Tn􀀀1, llamaremos comb(T0; T1; : : : ; Tn􀀀1) a la lista de todos
los posibles árboles formados combinando T0; : : : ; Tn􀀀1. Para n = 2 hay una sola combinación que
consiste
en poner a T0 como hijo izquierdo y T1 como hijo derecho de un nuevo árbol. Para aplicar el algoritmo de
búsqueda exhaustiva debemos poder generar la lista de árboles comb(T0; T1; : : : ; Tnchar􀀀1) donde Tj es
un
árbol que contiene un sólo nodo con el caracter j-ésimo. Todas las combinaciones se pueden hallar
tomando
cada uno de los posibles pares de árboles (Ti; Tj) de la lista, combinándolo e insertando comb(Ti; Tj) en
la
lista, después de eliminar los árboles originales.
comb(T0; T1; T2; T3) = (comb(comb(T0; T1); T2; T3);
comb(comb(T0; T2); T1; T3);
comb(comb(T0; T3); T1; T2);
comb(comb(T1; T2); T0; T3);
comb(comb(T1; T3); T0; T2);
comb(comb(T2; T3); T0; T1))

Estos tres posibles combinaciones pueden observarse en la figura 3.39. Para la figura hemos asumido que
los árboles originales son nodos simples, pero podrían ser a su vez árboles.
Entonces, cada una de las sublistas en (3.25) genera 3 árboles. En general vamos a tener
Nabc(n) = (número de posibles pares a escoger de n árboles) _ Nabc(n 􀀀 1) (3.27)
donde Nabc(n) es el número de árboles binarios completos de n hojas. El número de posibles pares a
escoger de n árboles es n(n􀀀1)=2. La división por 2 proviene de que no importa el orden entre los
elementos
del par. De manera que

Aplicando recursivamente esta relación llegamos a

Usando la aproximación de Stirling (1.34) llegamos a

Notar que esta estimación es menor que la obtenida en la sección anterior (3.24) ya que en aquella
estimación
se cuentan dos veces árboles que se obtienen intercambiando los hijos.

5.3. grafos

5.3.1 introduccion

Hoy en día podemos ver muchas cosas que nos pueden parecer de lo mas
cotidianas, carreteras, líneas telefónicas, líneas de televisión por cable, el
transporte colectivo metro, circuitos eléctricos de nuestras casas, automóviles, y
tantas cosas mas; lo que no pensamos frecuentemente es que estos forman parte de
algo que en matemáticas se denomina como grafos.

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 explicando de manera muy sencilla los conceptos y algunas


metodologías con un lenguaje no tan rebuscado para su mayor entendimiento.

5.3.2 terminología de grafos


Desafortunadamente no existe una terminología estandarizada en la teoría de los
grafos, por lo tanto es oportuno aclarar que las presentes definiciones pueden
variar ligeramente entre diferentes publicaciones de estructura de datos y de teoría
de grafos, pero en general se puede decir que un grafo como indica su nombre lo
indica es la representación (para nuestro caso) gráfica de los datos de una situación
particular, ejemplo:

   Los datos contienen, en algunos casos, relaciones entre ellos que no es


necesariamente jerárquica. Por ejemplo, supongamos que unas líneas aéreas
realizan vuelos entre las ciudades conectadas por líneas como se ve en la figura
anterior (más adelante se presentaran grafos con estructuras de datos); la
estructura de datos que refleja esta relación recibe el nombre de grafo.

Se suelen usar muchos nombres al referirnos a los elementos de una estructura de


datos. Algunos de ellos son "elemento", "ítem", "asociación de ítems", "registro",
"nodo" y "objeto". El nombre que se utiliza depende del tipo de estructura, el
contexto en que usamos esa estructura y quien la utiliza.

En la mayoría de los textos de estructura de datos se utiliza el termino "registro"


al hacer referencia a archivos y "nodo" cuando se usan listas enlazadas, árboles y
grafos.

También un grafo es una terna G = (V,A,j ), en donde V y A son conjuntos finitos,


y j es una aplicación que hace corresponder a cada elemento de A un par de
elementos de V. Los elementos de V y de A se llaman, respectivamente, "vértices"
y "aristas" de G, y j asocia entonces a cada arista con sus dos vértices.

Esta definición da lugar a una representación gráfica, en donde cada vértice es un punto
del plano, y cada arista es una línea que une a sus dos vértices.

5.3.3 representación de grafos

Representación por incidencia

Lista de incidencia

El grafo está representado por un arreglo de aristas, identificadas por un par de vértices,
que son los que conecta esa arista.

Matriz de incidencia

El grafo está representado por una matriz de A (aristas) por V (vértices), donde [arista,
vértice] contiene la información de la arista (conectado o no conectado).

Representación por adyacencia


Listas de adyacencia

El grafo está representado por un arreglo de listas de adyacencia. Para un vértice i, la


lista de adyacencia está formada por todos los vértices adyacentes a i. Puede construirse
en tiempo lineal, y las inserciones pueden hacerse al principio de cada lista, con lo que
se asegura tiempo constante.

Matriz de adyacencia

Una matriz de adyacencia es una matriz M de dimensión n*n, en donde n es el número


de vértices que almacena valores booleanos, donde M[i,j] es verdadero (o contiene un
peso) si y solo si existe un arco que vaya del vértice i al vértice j. La inicialización
llevaría un tiempo del O ( #(V )).

5.3.4 representacion enlazada de un grafo

Variante 1:

Una lista de vértices y cada uno tiene una lista de los vértices adyacentes a él

• secuenciales o enlazadas o una combinación.

• El grafo está vacío si no existen vértices. Las listas pueden ser indistintamente

Variante 2: Representación multienlazada

• Cada vértice se representa a través de un nodo que contiene:

• Apuntador a su información,

• Apuntador a una lista de arcos

• Apuntador al siguiente vértice en la lista

• Cada arco se representa por un nodo que contiene:

• Apuntador al próximo arco de su vértice origen

• Apuntador al nodo de su vértice destino

• El grafo está vacío si no hay vértices.

Contador de referencia formar parte de la información de los vértices y mantiene actualizado


la cantidad de arcos llegan a él.

• Los contadores de referencia facilitan algunas operaciones del grafo:

• Al eliminar un vértice se deben decrementar los contadores de referencia de los


vértices adyacentes. Si el contador del vértice adyacente se hace cero, se puede
eliminar ese vértice si la lista de arcos está vacía.
Sea G un grafo dirigido con m nodos. la representación secuencial de G en memoria-
o sea, la representación de G por su matriz de adyacencia A- tiene unas cuantas
desventajas importantes. en primer lugar, puede ser difícil insertar y eliminar nodos de
G. esto es porque el tamaño de A debería de ser cambiado y los nodos deberían ser
reordenados, así que habría muchos cambios en la matriz A. mas aun, si el numero de
aristas es 0(m) o 0(m log2 m), entonces la matriz A estará desperdiciada (contendrá
muchos ceros); por tanto, se desperdiciara una gran cantidad de espacio. Por tanto, G
normalmente se representa en memoria por una representación enlazada, también
llamada estructure de adyacencia.

LISTA DE NODOS. cada elemento de la lista NODO corresponderá a un nodo de G y


será un 
registro de la forma:
NODO
SIG

ADY

La representación mediante listas enlazadas es la que utilizaremos para la


implementación de la mayoría de los algoritmos de este tutorial, así que atención! ;)

Lo primero que debemos hacer es crearnos un vector con la cantidad de nodos de


nuestro grafo, este debe ser un "vector de vectores".

Cada posición de este vector representa a un nodo. Luego, en cada uno de los vectores
que están contenidos en las posiciones del vector principal, colocamos los nodos con los
que este tiene un arco.

Por ejemplo, si el nodo 1 tiene un arco que lo conecta con el nodo 2 y otro con el nodo
5, al vector que se encuentra en la posición uno del vector principal, se le agregan los
valores 2 y 5, como vemos en nuestro ejemplo.
5.3.5 operaciones de un grafo

Las operaciones en grafos producen nuevos grafos a partir de los primeros.

Operaciones unitarias
Operaciones elementales

También llamados operaciones de edición de grafos. Crean un nuevo grafo del original
por un simple cambio local:

 Adición o eliminación de un vértice o una arista


 Contracción de aristas
 Subdivisión

Operaciones avanzadas

 Grafo de línea
 Grafo dual
 Grafo complemento
 Grafo minor

Operaciones binarias
Las operaciones binarias crean un nuevo grafo de dos grafos iniciales y
:

 Unión de grafos
 Intersección de grafos
 Suma de grafos
 Producto de grafos basados en el producto cartesiano del conjunto de vértices
 Construcción de Hajós

En los grafos, como en todas las estructuras de datos, las dos operaciones básicas son
insertar y borrar. En este caso, cada una de ellas se desdobla en dos, para
insertar/eliminar vértices e insertar/eliminar aristas.

Insertar vértice

La operación de inserción de un nuevo vértice es una operación muy sencilla,


únicamente consiste en añadir una nueva entrada en la tabla de vértices (estructura de
datos que almacena los vértices) para el nuevo nodo. A partir de ese momento el grafo
tendrá un vértice más, inicialmente aislado, ya que ningúna arista llegará a él.

Insertar arista

Esta operación es también muy sencilla. Cuando se inserte una nueva arista en el grafo,
habrá que añadir un nuevo nodo a la lista de adyacencia (lista que almacena los nodos a
los que un vértice puede acceder mediante una arista) del nodo origen, así si se añade la
arista (A,C), se deberá incluir en la lista de adyacencia de A el vértice C como nuevo
destino.

Eliminar vértice

Esta operación es inversa a la inserción de vértice. En este caso el procedimiento a


realizar es la eliminación de la tabla de vértices del vértice en sí. A continuación habrá
que eliminar las aristas que tuviesen al vértice borrado como origen o destino.

Eliminar arista

Mediante esta operación se borra un arco del grafo. Para llevar a cabo esta acción es
necesario eliminar de la lista de adyacencia del nodo origen el nodo correspondiente al
nodo destino.

Otras operaciones

Las operaciones adicionales que puede incluir un grafo son muy variadas. Además de
las clásicas de búsqueda de un elemento o recorrido del grafo, también podemos
encontrarnos con ejecución de algoritmos que busquen caminos más cortos entre dos
vértices, o recorridos del grafo que ejecuten alguna operación sobre todos los vértices
visitados, por citar algunas operaciones de las más usuales.

5.3.6 recorrido de un grafo

Recorrer un grafo significa tratar de alcanzar todos los nodos que estén
relacionados con uno que llamaremos nodo de salida.    Existen básicamente dos
técnicas para recorrer un grafo: el recorrido en anchura; y el recorrido en
profundidad.

 Recorrido en anchura:    El recorrido en anchura supone recorrer el grafo, a


partir de un nodo dado, en niveles, es decir, primero los que están a una distancia
de un arco del nodo de salida, después los que están a dos arcos de distancia, y
así sucesivamente hasta alcanzar todos los nodos a los que se pudiese llegar
desde el nodo salida.

 Recorrido en profundidad: el recorrido en profundidad trata de buscar los


caminos que parten desde el nodo de salida hasta que ya no es posible avanzar
más. Cuando ya no puede avanzarse más sobre el camino elegido, se vuelve
atrás en busca de caminos alternativos, que no se estudiaron previamente.

También podría gustarte