SlideShare una empresa de Scribd logo
1 de 68
Descargar para leer sin conexión
HACK X CRACK: “PORT SCANNING” -- APRENDE A ESCANEAR LA RED

                              P
                              A
                              S
                              O
P A S Oa
       a
       a
       a
       a
       a
       a
       aa
        a
        a
        a
        a
        a




                                  ANALIZANDO EQUIPOS
                                         TOS
                                     REMOTOS

   BASES DE DATOS
      DISEÑO DE
   FORMULARIOS Y
    ORGANIZACION

  PROGRAMANDO


  VARIABLES Y
     PUNTEROS
   Nº 13 -- P.V.P. 4,5 EUROS
                      00013




    8 414090 202756
P
                              A
                              S
                              O
            aa
     P A S Oaa
            aa
            a
            a
            aa
             a
             a
             a
             a
             a
             a
             aa


EDITORIAL: EDITOTRANS S.L.                      Director de la Publicación
                                                J. Sentís
C.I.F:     B43675701
PERE MARTELL Nº 20, 2º - 1ª                     E-mail contacto
43001 TARRAGONA (ESPAÑA)                        director@hackxcrack.com
Director Editorial                              Diseño gráfico:
I. SENTIS                                       J. M. Velasco
E-mail contacto
director@editotrans.com                         E-mail contacto:
Título de la publicación
Los Cuadernos de HACK X CRACK.                  grafico@hackxcrack.com
Nombre Comercial de la publicacíón
PC PASO A PASO                                  Redactores
Web: www.hackxcrack.com                         AZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO,
Dirección: PERE MARTELL Nº 20, 2º - 1ª.         ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE,
            43001 TARRAGONA (ESPAÑA)
                                                ZORTEMIUS, AK22, DORKAN, KMORK, MAILA,
                                                TITINA, SIMPSIM... ... ... ... ...
¿Quieres insertar publicidad en PC PASO A Contacto redactores
PASO? Tenemos la mejor relación precio-difusión redactores@hackxcrack.com
del mercado editorial en España. Contacta con
nosotros!!!                                     Colaboradores
                                                Mas de 130 personas: de España, de Brasil, de
Director de Marketing                           Argentina, de Francia, de Alemania, de Japón y
Sr. Miguel Mellado                              algún Estadounidense.
Tfno. directo: 652 495 607
Tfno. oficina: 877 023 356
E-mail: miguel@editotrans.com                   E-mail contacto
                                                colaboradores@hackxcrack.com
                                                Imprime
                                                I.G. PRINTONE S.A. Tel 91 808 50 15
                                                DISTRIBUCIÓN:
                                                SGEL, Avda. Valdeparra 29 (Pol. Ind.)
                                                28018 ALCOBENDAS (MADRID)
                                                Tel 91 657 69 00 FAX 91 657 69 28
                                                WEB: www.sgel.es

                                                TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80
                                                Petición de Números atrasados y Suscripciones (Srta. Genoveva)

                                                HORARIO DE ATENCIÓN:                DE 9:30 A 13:30
                                                                                   (LUNES A VIERNES)
                                                © Copyright Editotrans S.L.
                                                NUMERO 13 -- PRINTED IN SPAIN
                                                PERIOCIDAD MENSUAL
                                                Deposito legal: B.26805-2002
                                                Código EAN:      8414090202756
EDITORIAL
      PREPARANDO EL FUTURO
Cuando uno forma parte de un proyecto, como por
ejemplo la publicación de una revista, debe preocuparse
tanto de los mil y un problemas diarios como de “el
futuro”. Hasta hace muy poco, PC PASO A PASO
(Los Cuadernos de Hack x Crack), ha sido publicada
siguiendo una filosofía tipo “vivir al día”, algo que      4 EDIT ORIAL
está muy bien en los inicios pero que no debe
                                                           5 XML:DOM
mantenerse demasiado tiempo.
                                                           14 C OLAB ORA C ON NOSO TR OS
Ahora estamos preparando toda una serie de cambios
cuyos resultados empezarán a “verse” en poco tiempo,       1 6 PR OGRAMA CION BA JO LINUX: LENGU A JE C
desde la Web hasta la revista… nuevos contenidos,
publicidad, más páginas, nuevos colaboradores y,           27 CURSO VISUAL BASIC: UN CLIENTE, UNA NECESIDAD(I).
sobre todo, mayor diversidad en las temáticas.
                                                           38 SERIE RAW (7): HTTP (I)
Hasta ahora nos hemos centrado en temas relacionados
con la Seguridad Informática orientada a Internet y        5 8 S E RV I D O R D E H XC . M O D O D E E M P L EO
hemos intentado “picar” al lector para que empiece
a programar. Ambos temas RED y CURSOS seguirán             66 C ONCURSO DE SUSE LINUX 8.2
siendo los principales pilares de PC PASO A PASO,
                                                           6 6 B A JAT E N U E S T R O S L O G O S Y M E L O D I A S
pero estamos trabajando duro para ofrecer mucho
más… tiempo al tiempo :)                                   66GANADOR DEL CONCURSO DE SUSE LINUX

Para nosotros está siendo muy difícil “madurar”, sería     66 SUSCRIPCIONES
sencillo tomar una línea tipo “análisis de productos”
y ganar de esta forma publicitantes y lectores tipo        67 NUMER OS ATRAS ADOS
“PC ACTUAL”, de hecho, hay publicaciones en el
mercado cuyas ventas ni siquiera cubren el precio de
la Imprenta pero que tienen importantes beneficios
por la publicidad. Nosotros estamos trabajando en la
cuadratura del círculo, seguiremos con nuestra temática
y la ampliaremos, seguiremos siendo educativos en
lugar de destructivos, pero empezaremos a diversificar
y, sobre todo, aumentar páginas. Esperamos poder
demostrar todo este trabajo (que hasta ahora permanece
“en la sombra”) para los primeros meses del próximo
año.

Tratar la temática Hack es tratar la Seguridad
Informática, al contrario de lo que muchos piensan
ambas cosas son exactamente lo mismo. Algunos
creyeron que era imposible hacer una revista de este
tipo sin caer en la vulgaridad y sin “empujar” al lector
a cometer todo tipo de actos ilícitos, se equivocaron…
si algo hemos hecho es enseñar y educar hasta la
saciedad.

GRACIAS POR LEERNOS
MANIPULACION DE
           DOCUMENTOS XML: EL DOM
          Primera parte: Teoria del DOM e interfaz
                        DOMDocument
                  Por Joaquim Roca Verges



          XML es una apuesta segura. El común de los mortales lo utilizamos cada día sin saberlo
          y es un estándar universal implementada en cualquier aplicación que se precie.



          Hasta ahora hemos visto lo que es el xml (nº10) y     archivo Power Designer versión 7.
           lo que son las DTD (nº 11 y 12). Recordamos que
          el XML es un lenguaje de intercambio de datos, que    Hará cosa de un año, fui a una presentación Microsoft
          hoy en día es prácticamente universal (todo el        de una herramienta BizTalk que sirve para procesar
          mundo lo entiende), y las DTD son reglas que podéis   archivos generados con SAP. Los archivos generados
          aplicar al XML. Ahora vamos a ver como procesar,      con SAP se guardaban... en formato XML.
          como recorrer, como extraer la información de los
          documentos XML.
                                                                    !               Para quien se...
          Y lo vamos a hacer con el DOM.
                                                                    Para quien se esté preguntando qué es eso del SAP, le damos otro
          Para daros ánimos e intentar inculcaros mi                par de siglas: ERP y CMR. Un ERP es, para que nos entendamos,
          entusiasmo me gustaría explicaros un par de las           un programa de gestión empresarial, pero no un "programita"
          muchas experiencias favorables y satisfactorias que       tipo "facturación/nominas", sino todo un sistema de gestión
          he tenido con este lenguaje.                              integral, para que te hagas una idea, los bancos y grandes
          Hace poco estuve diseñando una base de datos              multinacionales utilizan sistemas tipo ERP para gestionar desde
          bastante grande conjuntamente con otra empresa            los datacenters (centros de datos que pueden llegar a ocupar varias
          que llamaremos XXX. Nos reuníamos semanalmente            plantas de un edificio e incluso varios edificios) hasta la sucursal
          con los usuarios y fruto de las conversaciones con        de un pequeño pueblo o un simple punto de venta. Alguno estará
          ellos íbamos diseñando la base de datos. El diseño        pensando como es posible "instalar" un ERP (algo tan
          se hacia con Power Designer (podéis bajároslo de          aparentemente "grande") en un punto de venta (por ejemplo en
          http://crm.sybase.com/sybase/www/eBD/my_03/               un pequeño McDonals), pues bien, es posible porque un sistema
          pd952_dwnld_eval.jsp una vez os hayáis registrado),       ERP contiene infinidad de pequeños módulos especialmente
          una herramienta de modelado de base de datos de           adaptados para cada una de las áreas que puede tener una empresa.
          la casa Sybase. La empresa XXX utilizaba Power            Pero un ERP es mucho más, porque permite a las empresas
          Designer 7, y mi empresa disponía de Power Designer       ampliar, personalizar e incluso crear módulos completamente
          8 y 9.                                                    nuevos que se adapten perfectamente a cualquier tarea. Pero lo
                                                                    verdaderamente importante no es ni su capacidad ni su
          Si la empresa XXX hacia modificaciones y nos las          modularidad, lo realmente importante es que un ERP permite un
          mandaba a mi empresa ningún problema ya que               análisis global y en tiempo real de cualquier aspecto de una
          las versiones 8 y 9 entendían a la perfección la          empresa, desde una visión financiera de alto nivel (activos/pasivos
          versión 7, sin embargo si nosotros hacíamos               globales de toda una multinacional) hasta las ventas en la última
          modificaciones ellos no podían abrir nuestros             hora de una diminuta sucursal de un pequeño pueblo de Murcia.
          documentos.
                                                                    Pues bien, SAP es uno de los ERP más difundidos. Microsoft,
          Lo solucionamos guardando nuestras modificaciones         como no podía ser menos, compró una empresa especializada en
          como archivo XML, y entonces sí, entonces el colega       la creación de Software tipo ERP y comercializa su producto ERP
          de la empresa XXX cogía el XML y lo convertía a un        bajo el nombre de AXAPTA-NAVISION. Y nos queda el CMR,


PC PASO A PASO Nº 13                                                                                                        Página 5
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




                                                                         <DOCUMENTO>
                                                                                  <!-- solo se mostrará a partir de la una del mediodía -->
    que para no extendernos más diremos que es un importante
                                                                                  <BIENVENIDA hora="13:00"> Hola, buenas tardes </BIENVENIDA>
    módulo del Sistema ERP que se encarga de "los contactos",
                                                                         </DOCUMENTO>
    vamos, como el Outlook pero a lo grande ;p (espero que se capte
    la ironía, comparar Outlook con un CMR es de tan mal gusto
                                                                         este comentario también formaría parte del DOM.
    como comparar el vinagre con un buen vino :)

                                                                         Y (atención!!) el texto "Hola, buenas tardes" también es parte del
    No creo que en esta revista se trate nunca en profundidad los
                                                                         DOM
    sistemas ERP, de hecho, la temática que rodea al mundo de los
    ERPs es tan basta que daría para hacer una revista solo dedicada
                                                                         El DOM es el conjunto de todos los componentes (elementos,
    a ello. Lo malo es que, como todo lo bueno, apenas vendería un
                                                                         atributos, comentarios, entidades, texto...) que conforman el
    millar de ejemplares… aunque la cosa quizá está cambiando…
                                                                         documento XML.
    hasta hace poco únicamente las grandes corporaciones podían
    acceder a un sistema de este calibre (no solo por el precio, sino
                                                                         Todos estos componentes se denominan objetos.
    por lo complejo de su puesta en marcha, implantación, gestión,
    mantenimiento…); pero actualmente las empresas que crean este
                                                                         Por ejemplo, si nuestro PC fuera un documento XML, el DOM estaría
    tipo de productos están haciendo un guiño a las medianas e incluso
                                                                         formado por el disco duro, la memoria, el procesador, la pantalla,
    pequeñas empresas sacando al mercado "mini-ERPs" diseñados
                                                                         la frecuencia de la pantalla....
    específicamente para determinados sectores empresariales.

                                                                         El DOM es independiente del lenguaje de programación con el que
    Con esta nota, simplemente pretendemos abrir un poco tus
                                                                         estemos trabajando. Podemos acceder al DOM XML tanto con Java,
    horizontes. Los usuarios de informática muchas veces creemos
                                                                         como con Visual Basic, C, JavaScript...
    conocer los programas más importantes/difundidos, pero seguro
    que muy pocos lectores habrán instalado alguna vez un ERP en
                                                                         Está basado en lo que se denomina interfaz de nodos = un
    su ordenador. Si tenemos en cuenta que los ERP dominan el
                                                                         conjunto de métodos (funciones) y propiedades para los objetos
    mundo y que son los programas utilizados por las grandes
                                                                         (elementos, comentarios, atributos, entidades... del documento
    empresas/instituciones… ¿cómo es posible que la inmensa mayoría
                                                                         XML) DOM.
    de los usuarios no tengan/tengamos ni idea del tema?... Desde
    aquí te invitamos a que investigues sobre ello ;)
                                                                         El DOM es una vista estructurada de un documento XML. Podemos
                                                                         verlo como un árbol, y sus hojas:
                                                                          Una estructura de tipo árbol y las hojas se llaman nodos.
¿QUE ES EL DOM?
                                                                         Recordemos el XML de ordenes de compra:
DOM = Document Object Model, es decir modelo de objetos
del documento xml.                                                       <?xml versión="1.0" standalone="yes"?>
                                                                         <ORDEN_DE_COMPRA>
Hemos visto que un XML puede ser lo siguiente:                                    <CLIENTE>


<DOCUMENTO>                                                              <NUMERO_DE_CUENTA>12345678</NUMERO_DE_CUENTA>
      <BIENVENIDA> Hola, buenas tardes </BIENVENIDA>                                   <NOMBRE_COMPLETO>
</DOCUMENTO>                                                                                 <NOMBRE>Sam</NOMBRE>
                                                                                             <APELLIDO1>Bass</APELLIDO1>
Pues el modelo de objetos de este documento estaría formado por                              <APELLIDO2></APELLIDO2>
TODOS los elementos que lo componen, o sea por el elemento                             </NOMBRE_COMPLETO>
DOCUMENTO, y por el elemento BIENVENIDA y si por ejemplo el                     </CLIENTE>
elemento BIENVENIDA tuviera un atributo que se llamara "hora":           </ORDEN_DE_COMPRA>


<DOCUMENTO>                                                              Los elementos, comentarios, atributos, entidades, texto
         <BIENVENIDA hora="13:00"> Hola, buenas tardes </BIENVENIDA>     etc. que contiene el documento xml , se denominan todos
</DOCUMENTO>                                                             como NODOS, así tenemos que <NOMBRE> es un NODO y
                                                                         "Sam" es otro NODO.
también sería parte del DOM, y si hubiéramos escrito un comentario:      Y el conjunto de NODOS con sus funciones (lo que podemos


 Página 6                                                                                                        PC PASO A PASO Nº 13
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




hacer sobre los nodos) y propiedades se denomina
INTERFAZ DE NODOS.

Y ve á m o s l o r e p r e s e n t a d o c o m o u n c o n j u n t o d e n o d o s
que dibujaremos con elipses, y su contenido(el texto)
q u e re p r e s e n t a r e m o s c o n n o d o s re c t á n g u l o s ( e s u s u a l
 dibujarlo todo en rectángulos, pero he preferido
hacer esta primera aproximación de esta manera):




Si esto fuese un objeto Visual Basic, nos gustaría ser capaces de
manipular estos nodos, y leer y manipular sus valores. El objeto
Visual Basic que contiene el documento xml se llama
DocumentObject y los nodos son una matriz de objetos de tipo
NODE.

Con lo que la instrucción DocumentObject.Node (index).value nos
proporciona el valor de un nodo en particular. Y esto es básicamente
lo que el DOM (Document Object Model) XML hace: carga en
memoria el documento (con todos sus nodos) y accede, modifica,
añade, elimina…

Pero no nos adelantemos.

TIPOS DE NODOS QUE PUEDE CONTENER UN
DOCUMENTO XML

Todos los nodos comparten propiedades y métodos comunes, pero
dependiendo del tipo de nodo que sea, tiene unas propiedades
y métodos particulares.


  PC PASO A PASO Nº 13                                                                    Página 7
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




           Cuando estemos programando el DOM, podremos            Los elementos y el Texto, se tratan con las tres primeras interfaces
           hacer referencia al nodo indicando el tipo de nodo     (DOMDocument, XMLDOMNode y XMLDOMNodeList)
           (NODE_ ATTRIBUTE por ejemplo) o a su valor             Los atributos, no son hijos de ningún otro elemento, sino que
           númerico (2 para el NODE_ ATTRIBUTE)                   forman parte de un elemento. Como caracterizan a un elemento,
                                                                  es decir describen características de un elemento, son diferentes
           Siguiendo el ejemplo anterior:                         a los otros nodos, no están considerados como hijos de ningún
                                                                  padre y se tratan con la interfaz XMLDOMNamedNodeMap
           Serían NODE_ELEMENT:
                                                                  INTERFAZ DOMDocument
           <ORDEN_DE_COMPRA>;<CLIENTE>;<NUMERO
           _DE_CUENTA>;<NOMBRE_COMPLETO>;<NOMB                    Es la interfaz del objeto documento (nodo documento), que
           RE>; <APELLIDO1> y <APELLIDO2>                         incorpora propiedades y métodos para trabajar con el nodo raíz
                                                                  del DOM.
           Serían NODE_TEXT: "Sam" Y "Bass"                       El nodo raíz del DOM representa TODO el documento XML y no
                                                                  lo debemos confundirlo con el elemento raíz del documento.
                                                                  Si miráis el diagrama de nodos que hemos dibujado antes, podéis
           ¿CÓMO MANIPULAMOS EL ARCHIVO                           observar el nodo raíz del DOM arriba del todo, con la leyenda XML.
           XML CON EL DOM?                                        Seguidamente y colgando de el podéis ver el elemento raíz del
                                                                  documento que seria el nodo ORDEN_DE_COMPRA.
           Para manipular un documento XML, lo primero que
           tenemos que hacer es cargarlo en la memoria de         Vamos a irlo viendo todo con un ejemplo.
           nuestro ordenador con un parser XML. Nosotros          Cread en la raíz de vuestro sistema de archivos una carpeta que
           utilizaremos el parser de Microsoft: el Msxml, tal     se llame xmlDom ("C:xmlDom")
           como ya hicimos en el ejemplo de la primera entrega
           (nº 10).                                               Primero crearemos un DTD, contra el cual se validará nuestro xml.
           Una vez el documento está en memoria, ya lo            Abrid un editor de texto y escribid:
           podemos manipular utilizando el DOM
                                                                  <!ELEMENT ORDEN_DE_COMPRA (CLIENTE)>
                                                                           <!ELEMENT CLIENTE (NUMERO_DE_CUENTA,NOMBRE_COMPLETO)>
           El DOM, trata el documento XML como un árbol. El
           DocumentElement es el elemento superior o raíz                  <!ELEMENT NUMERO_DE_CUENTA ( #PCDATA)>
                                                                           <!ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, APELLIDO2) >
           del árbol. Este elemento raíz puede tener uno o
                                                                           <!ELEMENT NOMBRE (#PCDATA)>
           mas nodos (nodes) hijos (child) que representarían
                                                                           <!ELEMENT APELLIDO1 (#PCDATA)>
           las hojas del árbol.
                                                                           <!ELEMENT APELLIDO2 (#PCDATA)>

           Una interfaz, como hemos avanzado antes es un
                                                                  Guardad el archivo como ordenCompra.dtd dentro de la carpeta
           conjunto de métodos (funciones) y propiedades
                                                                  xmlDom
           para los objetos (elementos, comentarios, atributos,
           entidades... del documento XML) DOM.
                                                                  Abrid de nuevo el editor de texto y escribid

           Para acceder a los objetos del dom (los nodos del
                                                                  <?xml version "1.0" standalone="no" ?>
           DOM) disponemos de cuatro interfaces principales,
                                                                  "ordenCompra.dtd">
            que trataremos una a una a continuación:
                                                                  <ORDEN_DE_COMPRA>
                                                                           <CLIENTE>
           1.       DOMDocument                                                      <NUMERO_DE_CUENTA>12345678</NUMERO_DE_CUENTA>
           2.       XMLDOMNode                                                  <NOMBRE_COMPLETO>
           3.       XMLDOMNodeList                                                    <NOMBRE>Sam</NOMBRE>
           4.       XMLDOMNamedNodeMap                                                <APELLIDO1>Bass</APELLIDO1>
                                                                                      <APELLIDO2></APELLIDO2>
           Para la mayoría de documentos XML, los tipos de                      </NOMBRE_COMPLETO>
           nodos más comunes son:                                        </CLIENTE>
           •        Elementos                                     </ORDEN_DE_COMPRA>
           •        Atributos
           •        Texto                                         y guardad el archivo como Compra.xml

Página 8                                                                                                      PC PASO A PASO Nº 13
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




            Abrid el Visual Basic y cread un proyecto nuevo tal    '**************Escribid********************
            y como indicamos en el nº 10 (asumimos que tenéis      Dim xmlDocument As DOMDocument
            conocimientos básicos de visual basic): esto es        Dim xmlString as String
            •         Abrid el Visual Basic                        Dim blnValido As Boolean
            •         Seleccionar un Standard exe                  Set xmlDocument = New DOMDocument
            •         Añadid una referencia al DOM. Para ello      '****************************************
                      seleccionar del menú PROYECTO la opción
                      REFERENCIAS.                                 •       Cargar el documento xml en memoria, en el objeto de
            •         Buscad una que pone Microsoft XML, v3.0      tipo DOMDocument (método load()), asignarle algunas propiedades
                      y seleccionarla, haciendo click en el        y comprobar que está bien formado.
                      cuadradito que hay a la izquierda de modo
                      que quede marcado. Y dadle al botón de       '**************Escribid********************
                      Aceptar (yo lo tengo en inglés podéis ver    'Antes de cargarlo en memoria, damos valor a alguna de sus propiedades:
                      que en la pantalla se puede leer OK.)        'primero le indicamos que se ejecute de manera síncrona, esto es que se ejecute
                                                                   'inmediatamente, que se cargue inmediatamente
                                                                   xmlDocument.async = False
                                                                   'le indicamos que se valide contra el DTD
                                                                   xmlDocument.validateOnParse = True
                                                                   'y si hay referencias externas, que las resuelva. Por ejemplo, controlar que el DTD que
                                                                   'referenciamos existe donde le indicamos, en el path que le indicamos.
                                                                   xmlDocument.resolveExternals = True
                                                                   'si el documento es valido, el método Load que es el carga el documento
                                                                   devolverá un valor true, en caso contrario un valor false
                                                                   blnValido= xmlDocument.Load ("C:XmlDomCompra.xml")
                                                                   if blnValido then
                                                                              MsgBox "El documento es válido"
                                                                   Else
                                                                              MsgBox "El documento no cumple con el DTD"
                                                                              Exit sub
                                                                   End If
                                                                   '****************************************************



            Fijaros que el nombre de la referencia es a la dll            !                    Nota aclaratoria
            msxml3.
                                                                          Cuando asignamos un valor a una variable:
            A. DOMDocument CARGAR DEL DOCUMENTO,                          Dim i as integer
            CREAR UN NUEVO DOCUMENTO XML                                  I= 8
                                                                          Lo que estamos diciéndole al ordenador es:
            Colocad un botón en el formulario, id a las                   Dim i as integer => Resérvame un espacio en memoria para un tipo integer
                               propiedades y poner:                       I= 8 => En el espacio que me has reservado, colócame un 8
                               • name = cmdCargar
                               • caption = &Cargar                        En el ejemplo, cuando escribimos
                                                                          Dim xmlDocument As DOMDocument
                               documento xml
                                                                          Set xmlDocument = New DOMDocument
                                                                          xmlDocument.Load ("C:XmlDomCompra.xml")
                                   Codificad el evento click del          Lo que estamos diciendo al ordenador es:
                                   botón:                                 Dim xmlDocument As DOMDocument
                                                                          Set xmlDocument = New DOMDocument =>resérvame un
                                   •   Estas líneas de código             espacio en memoria para un tipo DomDocument
                                   lo que hacen es crear un               xmlDocument.Load ("C:XmlDomCompra.xml") => ponme en
                                   objeto        de     tipo              el espacio reservado el archivo Compra.xml
                                   DOMDocument:



Página 10                                                                                                                     PC PASO A PASO Nº 13
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




•         Pedimos que nos muestre el texto del xml en un mensaje:          B.   DOMDocument ACCEDER AL
                                                                           ARBOL DESDE EL ELEMENTO RAIZ,
'**************Escribid********************
                                                                           CONTENIDO DE UN NODO EN
MsgBox xmlDocument.Text
'****************************************                                  PARTICULAR

Si todo va bien, os mostrará el siguiente                                  Podemos acceder al árbol del DOM, empezando por
message box, con todo el texto del                                         la raíz y navegando hacia abajo del árbol (de el
documento:                                                                 nodo mas externo al mas interno) o bien podemos
                                                                           hacer una consulta de un nodo en particular.
•       Vamos a Crear el documento                                         Navegaremos desde el elemento raíz utilizando la
xml Compras2.xml de manera dinámica,                                       propiedad del domdocument documentElement ,
con el método LoadXML                                                      que nos devuelve el elemento raíz, convertido en un
                                                                           objeto de tipo XMLDOMNode (un objeto de la
'**************Escribid***********                                         interfaz XMLDOMNode).
'Ponemos todo el texto del xml en una variable de tipo String
'Fijaros en que he sustituido las dobles comillas de
‘version, de standalone y de la ubicación del dtd por ‘comillas simples         !             Al igual que...

xmlString = "<?xml version='1.0' standalone='no' ?>" & _                        al igual que una propiedad nos puede devolver un valor de
" <!DOCTYPE ORDEN_DE_COMPRA SYSTEM 'C:XmlDomordenCompra.dtd'>      "&_
                                                                                tipo booleano, también nos puede devolver un valor de
" <ORDEN_DE_COMPRA> " & _
                                                                                tipo objeto de una clase. En este caso nos devuelve un
" <CLIENTE> " & _
"    <NUMERO_DE_CUENTA>87654321</NUMERO_DE_CUENTA> " & _
                                                                                objeto de la interfaz documentElement. Por eso hemos
"    <NOMBRE_COMPLETO> " & _                                                    tenido que declarar una variable de este tipo. Veréis este
"      <NOMBRE>Pat</NOMBRE> " & _                                               tipo de asignaciones muy frecuentemente cuando trabajéis
"      <APELLIDO1>Garret</APELLIDO1> " & _                                      con el Dom.
"      <APELLIDO2></APELLIDO2> " & _
"    </NOMBRE_COMPLETO> " & _
" </CLIENTE> " & _                                                         Necesitaremos pues, referenciar de alguna manera
" </ORDEN_DE_COMPRA>"                                                      la interfaz IXMLDOMElement (el DOM tiene mas
                                                                           interfaces que las cuatro principales; esta se utiliza
'el método loadXML carga en memoria, en el dom, la cadena que le pasamos   para nodos de tipo elemento. Es una ampliación de
                                                                           de XMLDomNode) y la interfaz XMLDOMNode. Lo
xmlDocument.loadXML xmlString                                              haremos con dos variables de estos tipos. (Mirad
MsgBox xmlDocument.Text
                                                                           el ejemplo)

'****************************************************
                                                                           Para navegar por el documento, vamos a crear un
                     El texto del segundo mensaje será distinto,
                     ahora os saldrá.                                      nuevo DTD y un nuevo XML muy parecidos a los
                                                                           que hemos estado utilizando hasta ahora.
                             • Finalmente, Guardamos el archivo            Vamos a cambiar solamente el nodo raíz, vamos a
                             xml generado, con un nombre distinto,         hacer que ORDEN_DE_COMPRA cuelgue de un nuevo
                             con el método save                            elemento que llamaremos PEDIDOS. Y ampliaremos
                                                                           la información que puede tener ORDEN_DE_COMPRA
                                                                           añadiéndole el elemento PRODUCTO.
'**************Escribid********************************
'el método save guarda el documento generado o modificado.                 Finalmente vamos a indicar a ORDEN_DE_COMPRA
xmlDocument.save ("C:XmlDomCompra2.xml")
                                                                           que tiene puede tener mas de un orden de compra
'liberamos memoria
                                                                           con el signo +.
On Error Resume Next
Set xmlDocument = Nothing
'****************************************************                      Abrid un editor de texto y escribid:



    PC PASO A PASO Nº 13                                                                                                            Página 11
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




<!ELEMENT PEDIDOS (ORDEN_DE_COMPRA+)>                                  Codificad el evento click del botón:
         <!ELEMENT ORDEN_DE_COMPRA (CLIENTE, PRODUCTO)>
         <!ELEMENT CLIENTE (NUMERO_DE_CUENTA,NOMBRE_COMPLETO)>         Private Sub cmdArbolDoc_Click()
         <!ELEMENT PRODUCTO (#PCDATA)>                                 Dim xmlDocument As DOMDocument
         <!ELEMENT NUMERO_DE_CUENTA ( #PCDATA)>                        Dim raizDocumento As IXMLDOMElement
         <!ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, APELLIDO2) >   Dim nodohijo As IXMLDOMNode
         <!ELEMENT NOMBRE (#PCDATA)>                                   Dim xmlString As String
         <!ELEMENT APELLIDO1 (#PCDATA)>                                Set xmlDocument = New DOMDocument
         <!ELEMENT APELLIDO2 (#PCDATA)>                                'síncrono, externas y DTD
                                                                       xmlDocument.async = False
Guardad el archivo como pedidos.dtd                                    'le indicamos que se valide contra el DTD
Abrid de nuevo el editor de texto y escribid:                          xmlDocument.validateOnParse = True
                                                                       'y si hay referencias externas, que las resuelva.
<?xml version="1.0" standalone="no" ?>                                 xmlDocument.resolveExternals = True
<!DOCTYPE PEDIDOS SYSTEM                                               If xmlDocument.Load("C:xmlDompedidos.xml") Then
         "pedidos.dtd">                                                   MsgBox "El documento es válido"
<PEDIDOS>                                                              Else
         <ORDEN_DE_COMPRA>                                                MsgBox "El documento no cumple con el DTD"
         <CLIENTE>                                                        Exit Sub
                                                                       End If
<NUMERO_DE_CUENTA>12345678</NUMERO_DE_CUENTA>                          'le decimos que raizDocumento = PEDIDOS
             <NOMBRE_COMPLETO>                                         Set raizDocumento = xmlDocument.documentElement
                   <NOMBRE>Sam</NOMBRE>                                'Navegamos por los nodos hijos del elemento raíz
                   <APELLIDO1>Bass</APELLIDO1>                         For Each nodohijo In raizDocumento.childNodes
                   <APELLIDO2></APELLIDO2>                                MsgBox nodohijo.Text
             </NOMBRE_COMPLETO>                                        Next
      </CLIENTE>                                                       'liberamos la memoria
      <PRODUCTO>LIBRO</PRODUCTO>                                       On Error Resume Next
      </ORDEN_DE_COMPRA>                                               Set nodohijo = Nothing
      <ORDEN_DE_COMPRA>                                                Set raizDocumento = Nothing
      <CLIENTE>                                                        Set xmlDocument = Nothing

<NUMERO_DE_CUENTA>987654321</NUMERO_DE_CUENTA>                         End Sub
              <NOMBRE_COMPLETO>
                    <NOMBRE>Jesse</NOMBRE>                             Fijaros en los dos mensajes que os han salido por
                    <APELLIDO1>James</APELLIDO1>                       pantalla:
                    <APELLIDO2></APELLIDO2>
              </NOMBRE_COMPLETO>
       </CLIENTE>                                                                            Seguido de
       <PRODUCTO>DISCO DE VINILO</PRODUCTO>
       </ORDEN_DE_COMPRA>
</PEDIDOS>
                                                                       Vamos a interpretarlo.
Volved al Visual Basic
Colocad un botón en el formulario, id a las propiedades y poner:       El DOM, ha leído el primer nodo que contenía el
•        name = cmdArbol                                               nodo raíz. El nodo raíz es PEDIDOS, y el texto que
•        caption = &árbol del documento xml                            ha leído el DOM es el texto que tenia su primer nodo
                                                                       hijo ORDEN_DE_COMPRA, y el texto que tenia su
                                                                       primer nodo hijo era TODO el texto que contenía
                                                                       ORDEN_DE_COMPRA.

                                                                       ¿Y cual es todo el texto que tiene el primer nodo
                                                                       ORDEN_DE_COMPRA?, pues nada más y nada menos


  Página 12                                                                                                   PC PASO A PASO Nº 13
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




          que el texto que tienen todos sus nodos hijos:         Si lo entendéis, si os ha entrado bien en la cabeza,
          •       12345678                                       lo tenéis muy pero que muy bien.
          •       Sam                                            Para consultar un nodo en particular, podemos
          •       Bass                                           utilizar el método getElementsByTagName que
          •       LIBRO                                          devuelve todos los nodos elemento de un tag en
                                                                 concreto. Devuelve un array que contiene todos los
          Y para el segundo nodo ORDEN_DE_COMPRA lo              elementos del documento que tienen ese nombre.
          mismo, todo el texto que tienen todos sus nodos        Recordad que un tag es otra manera de llamar a un
          hijos:                                                 elemento: Al elemento <ORDEN_DE_COMPRA>
          •        987654321                                     también podéis llámalo tag <ORDEN_DE_COMPRA>
          •        Jesse
          •        James                                         Volved al Visual Basic
          •        DISCO DE VINILO                               Colocad un botón en el formulario, id a las propiedades
                                                                 y poner:
          Para verlo mas claro, pensemos en el explorador        •        name = cmdUnElemento
          de windows.                                            •        caption = &Un elemento concreto del
                                                                          árbol
          Supongamos esta estructura de directorios:




                                                                 Codificad el evento click del botón:

                                                                 Private Sub cmdUnElemento_Click()
                                                                 Dim ListaDeNodos As IXMLDOMNodeList
                                                                 Dim xmlDocument As New DOMDocument
                                                                 Dim i As Integer
                                                                 xmlDocument.async = False
                                                                 xmlDocument.validateOnParse = True
                                                                 xmlDocument.resolveExternals = True
                                                                 If xmlDocument.Load("C:xmlDompedidos.xml") Then
                                                                      MsgBox "El documento es válido"
                                                                 Else
                                                                     MsgBox "El documento no cumple con el DTD"
                                                                     Exit Sub
                                                                 End If
          Supongamos que ordenCompra tiene un archivo            MsgBox xmlDocument.xml
          que se llama 12345678.txt                              Set ListaDeNodos = xmlDocument.getElementsByTagName("NOMBRE")

          Supongamos que Apellido1 tiene un archivo que se       For i = 0 To (ListaDeNodos.length - 1)
          llama Sam.txt                                            MsgBox ListaDeNodos.Item(i).xml
          Supongamos que Apellido2 tiene un archivo que se         MsgBox ListaDeNodos.Item(i).Text
          llama Bass.txt                                         Next
          Supongamos que Producto tiene un archivo que se        On Error Resume Next
          llama LIBRO.txt                                        Set ListaDeNodos = Nothing
                                                                 Set xmlDocument = Nothing
          Y pedimos al Sistema Operativo que nos liste todos     End Sub
          los archivos que contiene la carpeta Pedidos....
          Efectivamente nos devolverá lo mismo que nos ha        Utilizamos la interfaz IXMLDOMNodeList, interfaz
          devuelto el DOM de XML.                                que nos permite trabajar con la lista de nodos del
          Pararos un segundo en pensar y analizar este código.   DOM, tal como su nombre indica.


PC PASO A PASO Nº 13                                                                                                             Página 13
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




            Fijaros en que el atributo xmlDocument.xml os           a true, preserva los espacios en blanco del documento
            devuelve el contenido de todo el xml, y el atributo     •       ReadyState = nos indica el estado en que
            del ListaDeNodos.Item(i).xml nos devuelve también       se encuentra el documento en este momento. Por
            el contenido de todo el xml que contiene ese nodo,      ejemplo el documento puede hallarse en estado
            y así como el atributo xmlDocument.text nos             LOADING (cargando) o en estado COMPLETE (carga
            devuelve el contenido de texto de todo el documento     completa y el DOM disponible)
            xml, el atributo de la interfaz ixmldomnodelist
            ListaDeNodos.Item(i).text también nos devuelve el
                                                                    •        url = devuelve una cadena (string) que
                                                                    nos informa de la url de Internet donde se halla
            texto del nodo que hemos seleccionado.
                                                                    nuestro xml
            Con ello os quiero demostrar que aunque son
            interfaces diferentes, el comportamiento es el mismo,   Los métodos mas importantes de la interfaz
            si encontráis en alguna otra interfaz las propiedades   DomDocument, son los que hemos visto (load,
            xml, o text, sin hacer ninguna prueba ya podéis         loadXML, getElementsbyTagName y Save) y
            saber lo que devuelve.                                  los de creación de fragmento de xml.
                                                                    Supongamos que queremos añadir otro
            C.   DOMDocument CREAR UN                               ORDEN_DE_COMPRA a nuestro xml: el modo de
            FRAGMENTO DE XML                                        hacerlo es creando un nuevo nodo
                                                                    ORDEN_DE_COMPRA de acuerdo con el DTD(con
            Hemos visto hasta ahora las principales propiedades     todos sus nodos hijos tal como se especifica en el
            de la interfaz DomDocument, pero no todas. Las          DTD) y una vez creado lo insertaremos en el
            otras propiedades son informativas del documento:       documento xml.
                                                                    El tiempo en que este nuevo nodo esta desvinculado
            •        Doctype= devuelve el tipo de documento
                                                                    de nuestro documento XML, tiempo en el que le
            asociado al xml, en nuestro ejemplo nos devolvería
                                                                    estamos añadiendo sus nodos hijos es el tiempo de
            el dtd.
                                                                    creación de un fragmento xml, que es un trozo
            •        PreserveWhiteSpace = que si ponemos            de xml a anexar al xml principal.


            ¿QUIERES COLABORAR CON PC PASO A PASO?
            PC PASO A PASO busca personas que posean conocimientos de
            informática y deseen publicar sus trabajos.
            SABEMOS que muchas personas (quizás tu eres una de ellas) han creado
            textos y cursos para “consumo propio” o “de unos pocos”.

            SABEMOS que muchas personas tienen inquietudes periodísticas pero
            nunca se han atrevido a presentar sus trabajos a una editorial.
            SABEMOS que hay verdaderas “obras de arte” creadas por personas
            como tu o yo y que nunca verán la luz.

            PC PASO A PASO desea contactar contigo!

            NOSOTROS PODEMOS PUBLICAR TU OBRA!!!
            SI DESEAS MÁS INFORMACIÓN, envíanos un mail a
            empleo@editotrans.com y te responderemos concretando nuestra oferta.


Página 14                                                                                                   PC PASO A PASO Nº 13
XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM




       Todo nuevo nodo se construye con los métodos de   con los métodos
       la interfaz DOMdocument que comienzan con la
       palabra create+tipodenodo. Por ejemplo para       •        InsertBefore
       crear un nodo de tipo elemento haremos
       createElement, y para crear un atributo haremos
                                                         •        RemoveChild
       createAttribute etc.                              •        ReplaceChild
                                                         Veremos un ejemplo de cómo crear un nuevo nodo,
       Listado de métodos create que se utilizan         en el próximo capítulo, cuando tratemos la interfaz
       para crear un fragmento xml:                      XMLDOMNode ya que es necesaria para
                                                         "enganchar" un nodo hijo a su padre, por ejemplo
                                                         <NOMBRE_COMPLETO> a <CLIENTE>, o para borrar
       •       CreateAttribute
                                                         un nodo hijo, necesitaremos de muchas de las
       •       CreateCDATASection                        propiedades y métodos que tiene esta interfaz
       •       CreateComment
       •       CreateDocumentFragment                    Tenéis la lista completa de propiedades y métodos
                                                         de DOMDocument en la dirección:
       •       CreateElement
       •       CreateEntityReference                     http://msdn.microsoft.com/library/default.asp?url
       •       CreateNode                                =/library/en-us/xmlsdk30/htm/
       •       CreateProcessingInstruction               xmobjxmldomdocument.asp

       •       CreateTextNode
                                                         ¡Saludos compañeros!

       también podemos, sustituir, insertar los nodos
Programacion en GNU/LiNUX
              Desarrollo de aplicaciones en
               entornos UNiX e iniciaciaon al
                      lenguaje C (II)
                el_chaman.                     Luis U. Rodriguez Paniagua




            Este mes, en nuestra entrega habitual de LINUX entraremos en el temido mundo de los
            punteros en C (entre otras cosas). Coged aire y ADELANTE!!!




            1. Introducción.                                         2.1. Arrays o vectores

                                                                     A casi todos nos sonará el término vector de haberlo visto en
            En el artículo anterior vimos como a la hora de
                                                                     matemáticas. Allí considerábamos un vector o arreglo como una
            realizar un proyecto en un entorno UNiX se suele
                                                                     colección de bloques de datos. En la programación sucederá algo
            emplear una modularización del mismo para mejorar
                                                                     similar: Un array o vector será una colección de datos del mismo
            la productividad. Así mismo comenzamos una breve
                                                                     tipo.
            introducción al lenguaje C que enlazaba con las
                                                                     Además de esta definición, surgen dos términos asociados al
            estructuras de control de dicho lenguaje vistas en
                                                                     término vector: la dimensión y el índice
            el primer artículo de esta serie.
                                                                     Para entender qué es un vector y cómo funcionan estos dos nuevos
                                                                     conceptos, vamos a imaginarnos lo siguiente:
            Este artículo, tal vez por la necesidad de la
            temática, está orientado a la práctica. Se propondrán
                                                                     Tal como vimos en el anterior número podemos definir las variables
            algunos ejercicios y búsqueda de información, que
                                                                     como cajas en las que meter datos. Así mismo vimos que los tipos
            espero hagan de su lectura y estudio un tema
                                                                     de dichas variables nos decían de qué tamaño eran dichas cajas.
            ameno.

                                                                     Dicho esto podremos definir un vector como un conjunto de cajas
            Continuando con lo visto, hoy seguiremos viendo
                                                                     del mismo tamaño colocadas en fila. El índice será la posición de
            algunos de los tipos disponibles en C. En el número
                                                                     una determinada caja dentro de estas cajas y la dimensión será
            anterior se quedaron en el tintero los tipos derivados
                                                                     cómo podemos colocar en el espacio las distintas filas, columnas,
            debido a que he considerado que el tema de los
                                                                     etc... que formarán la geometría de este conjunto de cajas.
            punteros, vectores y matrices, merece un tratamiento
            más profundo que el de los tipos básicos.
            Y sin entretenernos más pasemos ya a los tipos               /* Ejemplo de declaración de varios tipos de vectores o arrays */
            derivados.                                                   /* Vector unidimensional de números enteros */
                                                                         int un_vector[5];
            2. Tipos Derivados.
                                                                         /* Vector bidimensional o matriz de números reales */
            Los tipos derivados serán aquellos que se generen            float una_matriz[5][5];
            a partir de los tipos fundamentales o de otros tipos         /* Vector tridimensional de caracteres */
            derivados. Nosotros veremos los arrays o vectores,
                                                                         char un_cubo[5][5][5];
            punteros, estructuras, uniones y campos de bits.


Página 16                                                                                                     PC PASO A PASO Nº 13
Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)-




           Como podemos observar en el ejemplo, la declaración    Así por ejemplo, para introducir datos en una casilla
           de un vector corresponde al siguiente esquema:         teclearemos algo como:

           tipo_array nombre_array[dim1][dim2]..[dimN]            un_vector[0] = 34;
           Donde tipo_array será el tipo de datos que contiene    un_vector[1] = 2 + 3;
           el array (es decir el tamaño de cada una de las        una_matriz[2][3] = 3.1416 * 34;
           cajas que lo componen), nombre_array será el           un_cubo[0][2][1] = 'a';
           nombre que demos al array y [dimX] será el tamaño
           tope de cada una de las dimensiones, o dicho de        Para acceder al contenido se hará de manera similar:
           otro modo: el número máximo de cajas que se                  int suma;
           admite en una dimensión.                                    char respuesta;
                                                                       ...
           Para entender mejor el concepto de dimensión,               suma = un_vector[0] + un_vector[1];
           representemos gráficamente el código arriba visto:          printf("%f", una_matriz[2][3]);
                                                                       ...
                                                                       printf(" Teclee una letra: ");
                                                                       scanf("%c", &respuesta);
                                                                       if( un_cubo[0][2][1]==respuesta)
                                                                       printf("Ha pulsado una a");



                                                                       !                  No se intente...

                                                                       No se intente buscar sentido alguno a los dos últimos
                                                                       ejemplos: Están hechos con la intención de mostrar el
                                                                       acceso a los componentes de un array. Fíjense en cómo se
                                                                       acceden a los datos, no en lo que se hace con ellos. Este
                                                                       será un tema que trataremos a lo largo del curso.
                                                                       En el primer ejemplo mostramos como introducir datos en
                                                                       casillas concretas de los distintos arrays dependiendo del
                                                                       tipo de estos, y en el segundo caso mostramos como sacar
                                                                       datos de dichos arrays.


                                                                   A continuación vamos a hacer un programa que
                                                                   cree una matriz de dimensión 3x4 (tres filas y cuatro
           Observando el gráfico arriba expuesto, accederemos     columnas) y la llene de con sus coordenadas de la
           al contenido de cada casilla mediante sus              siguiente manera: El número almacenado en cada
           coordenadas. Obsérvese algo muy importante: En         casilla mostrará en su parte entera el número de
           C, siempre los índices empiezan a contar desde 0.      fila, y en su parte decimal en número de columna.
           Esto quiere decir que si declaramos un vector con      Así las segunda casilla de la primera fila contendrá
           cinco casillas, a la hora de poner su dimensión        un 0.1 (Recordemos que las coordenadas empiezan
           pondremos int un_vector[5] pero a la hora de           a contar en C siempre desde 0).
           acceder a todas sus casillas pondremos un_vector[0],
                                                                  /*
           un_vector[1], un_vector[2], un_vector[3] y
                                                                  * Programa: ej00.c
           un_vector[4] siendo el número total de casillas
                                                                  *
           cinco, pero siendo el valor máximo del índice una
                                                                  * Descripción: Crea una matriz de dimensión 3x4, llena cada casilla
           unidad menor que la dimensión total del vector.
                                                                  * con sus coordenadas de la siguiente manera:


 PC PASO A PASO Nº 13                                                                                                                   Página 17
Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)




            * _____ _____ _____ _____                                                     representar las coordenadas de la casilla en un único
            * |_0.0_|_0.1_|_0.2_|_0.3_|                                                   número. Puesto de otra forma:
            * |_1.0_|_1.1_|_1.2_|_1.3_|
                                                                                             matriz[num_fila][num_col]= num_fila + (num_col * 0.1);
            * |_2.0_|_2.1_|_2.2_|_2.3_|
            *                                                                             Así para la casilla matriz[0][2] tendremos que su
            * e imprime el contenido de la matriz por pantalla.                           contenido será 0 + ( 0.2 ) = 0.2.
            *
            * Compilación:                                                                Hasta ahí todos de acuerdo. Ahora bien: ¿ Qué
            *      gcc ej00.c -o ej00                                                     significa eso de poner (float) delante de las variables
                                                                                          contadoras i y j?.
            */
            #include <stdio.h>                                                            A esto se le denomina casting y consiste en
            main()                                                                        transformar el tipo del resultado que nos devuelve
            {                                                                             una operación cuyos operadores son den tipo distinto
                   /* Declaración de la matriz de tres filas por cuatro columnas */       a quien va a recibir el dato. Dicho de otra manera:
                   /* Tiene que ser de números reales */                                  Sirve para cambiar el tipo de un dato en tiempo de
                   float matriz[3][4];                                                    ejecución.
                   /* Declaración de variables auxiliares contadoras */
                                                                                          Si prestamos atención a la línea de la que estamos
                   int i,j;
                                                                                          hablando, veremos que los operadores son de tipo
                   /* Llenamos la matriz con datos */
                                                                                          entero, pero no así el resultado que esperamos
                   /* i contará filas */
                                                                                          conseguir tras la operación. Es por ello que ese
                   for(i=0;i<3;i++)                                                       resultado lo tenemos que convertir a real. En próximos
                   {                                                                      ejemplos veremos más usos del casting.
                         /* j contará columnas dentro de cada fila */
                         for(j=0;j<4;j++)                                                 2.1.1. Ejercicio 0.0
                         {
                                                                                          Se desea hacer un juego del tres en raya para dos
                                matriz[i][j]= (float)(i + (j * 0.1));
                                                                                          jugadores humanos muy sencillo. Las posibles
                         }
                                                                                          pantallas a mostrar a lo largo del juego pueden ser
                   }
                                                                                          las siguientes:
                   /* Imprimimos la matriz */
                   for(i=0;i<3;i++)                                                              ___|___|___       _X_|___|___
                   {
                         for(j=0;j<4;j++)                                                        ___|___|___       ___|_O_|___

                         {
                                                                                                 ___|___|___       ___|___|_O_
                                printf(" %1.1f ",matriz[i][j]);
                         }                                                                Se pide además que el estado del tablero actual se
                         /* Después de imprimir una fila, debemos de saltar una línea*/   conserve en una matriz de dimensión 3x3 de números
                         printf("n");                                                    enteros.
                   }                                                                      Entrada y Salida
            }
                                                                                          La entrada y la salida en C se realizan habitualmente
            En este programa de ejemplo, debemos de abundar                               sobre los dispositivos de entrada estándar ( stdin )
            en una línea un tanto extraña:                                                y salida estándar ( stdout). Tradicionalmente se
                                                                                          asocia la entrada estándar al teclado y la salida
                 matriz[i][j]= (float)(i + (j * 0.1));                                    estándar a la pantalla de la consola, pero esto no
                                                                                          tiene porqué ser así siempre. Ya trataremos con
            En un principio puede parecer que efectivamente                               ficheros y veremos que stdin y stdout no son más
            estamos empleando la fórmula adecuada para                                    que dos de los muchos flujos de datos que podremos

Página 18                                                                                                                            PC PASO A PASO Nº 13
Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)




           emplear en un programa.                                                        que estamos tratando :

           A efectos prácticos nosotros consideraremos por                                Tabla 1. Formatos de tipos de dato
           ahora que la entrada estándar (stdin)
           es el teclado y tiene una función de
           lectura asociada llamada scanf y que la
           salida estándar (stdout) es la consola
           del ordenador y tiene asociada la función
           printf.

           En conclusión: La lectura de datos del
           teclado se hará mediante scanf y la
           impresión de datos en la pantalla de la
           consola se hará mediante printf.

           Un ejemplo de lectura de datos puede
           ser:
                   int coor_x, coor_y;
                   ...
                   printf("n Deme la coordenada X: ")
                   scanf("%i",&coor_x);
                   printf("n Deme la coordenada Y: ");
                   scanf("%i",&coor_y);
                   ...
                                                                                          Para estos formatos podemos también especificar el
           Observese el & que ponemos delante de la variable                              ancho de caracteres reservados para expresar un
           donde queremos depositar el dato leído por teclado.                            número. Asi %5i reservaría 5 caracteres para imprimir
           Al término del artículo de hoy seremos capaces de                              un número entero, independientemente de la longitud
           comprender qué significa ese & y por qué lo ponemos                            de este. %5.2f reservaría 5 caracteres para imprimir
           ahí. Por ahora baste decir que estamos depositando                             la parte entera y dos para la parte decimal, etc...
           el dato leído en la posición de memoria donde se
                                                                                          Obsérvese también, que debemos de poner la cadena
           encuentra la variable donde queremos que se guarde
                                                                                          de formato en el lugar exacto donde queremos que
           dicho dato.
                                                                                          se imprima el dato, y, posteriormente una lista de
           Un ejemplo de impresión de datos puede ser:                                    variables que irán en el mismo orden el que queremos
                                                                                          que aparezca el dato.
           int var_entera=3;
           float var_real=3.14;                                                           Dadas las siguientes variables:
           char cadena[8]="Hola0";                                                             int varA=3;
           char var_char='a';                                                                    float varB=4;
           printf("Valores: %i, %f, %s, %c. ", var_entera, var_real, cadena, var_char);
                                                                                               char varC[6]="Hola0";
           A la hora de imprimir el contenido de una variable,                                 char varD='e';
           (o de leerlo, observar el ejemplo anterior de scanf,
                                                                                          Serán ejemplos correctos:
           tenemos que decir de alguna manera a las funciones
                                                                                               printf(" %3i ", varA);
           de lectura o escritura de datos por entrada y salida
           estándar respectivamente ( scanf y printf ) qué es                                 scanf("%f",&varB);
           lo que van a leer o escribir. Para ello se emplean                                 printf("Una cadena: %s y un real: %3.6f ",varC, varB);
                                                                                              printf("Una letra %c y un número: %i", varD, varA);
           las cadenas de formato. Las cadenas de formato
                                                                                              printf("Una letra %c y otra letra %c", varD, varC[1]);
           son esas letras que comienzan por % y que en
                                                                                              printf("Decimal: %i, Octal: %o, Hexadecimal: %x ", varA, varA, varA);
           función de su valor, indican el tipo de dato con el

 PC PASO A PASO Nº 13                                                                                                                                                 Página 19
Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)




            E incorrectos:                                                Prescindiendo de esa oscura mitología y de historias
               printf(" %i ", varC);                                      espeluznantes que se cuentan relacionadas con los
               scanf("%f",&varA);                                         mismos, trataremos de presentar los punteros de
               printf("Una cadena: %s y un real: %f ",varD, varA);        una manera clara y asequible, de manera que les
               printf("Una letra %c y un número: %i", varA, varD);        perdamos el miedo pero nunca el respeto, dado que
               printf("Una letra %c y otra letra %c", varD, varC);        son una de las herramientas más potentes que nos
               printf("Decimal: %i, Octal: %o, Hexadecimal: %x ", varA)   suministra el lenguaje C.

            Además de las cadenas de formato, printf admite               2.2.1. ¿Qué son los punteros?:
            una serie de caracteres no imprimibles o secuencias           Desmitificando al monstruo
            de estape como son:
                                                                          Un puntero no es más que una variable que cuyo
            Tabla 2. Secuencias de escape para printf                     contenido, en vez de datos, son direcciones de
                                                                          memoria.

                                                                          Dicho de otra forma: Hasta ahora utilizábamos las
                                                                          variables para guardar cantidades numéricas,
                                                                          caracteres o cadenas de texto. Ahora utilizaremos
                                                                          un tipo especial de variable que será capaz de guardar
                                                                          una dirección de memoria.

                                                                          Contemplemos el siguiente esquema que nos resultará
                                                                          familiar del anterior artículo (PC PASO A PASO 12):




            El programa debe se capaz de verificar cuando se
            ha hecho tres en línea y cuándo ha habido tablas.
            Así mismo debe de verificar que las coordenadas
            están dentro del rango permitido y el turno de cada
            jugador.

            2.2. Punteros

            Los punteros suelen ser el caballo de batalla al que
            se enfrentan los programadores que se adentran
            por primera vez en lenguajes como C o Pascal.


Página 20                                                                                                          PC PASO A PASO Nº 13
Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)




             En la primera línea resaltada char *var_puntero;,          Otros ejemplos de declaración de punteros serán:
             lo que hacemos es declarar una variable
             de tipo puntero que es capaz de apuntar a                    int *p_entero;

             direcciones de memoria (es decir, es capaz
                                                                          float *p_real;
             de guardar direcciones de memoria), que
             contengan un dato char. Esto puede causar                    char *p_caracter;
             confusión dado que si sabemos que los
             punteros contienen direcciones de memoria, ¿qué
              necesidad hay de asociarlos un tipo? Esta pregunta,           !                Existe un tipo de...
             que en principio puede parecer compleja, queda
             explicada cuando más adelante veamos que como
             el resto de las variables podemos realizar operaciones         Existe un tipo de puntero denominado void que virtualmente
             aritméticas con el contenido de las mismas, como
                                                                            en conjunción con el casting es capaz de apuntar a cualquier
             por ejemplo el incremento. Claro que no es lo mismo
                                                                            tipo de variable o dirección de memoria. Recomiendo que
             incrementar una dirección que apunta a caracteres
                                                                            el lector investigue por su cuenta este tipo de punteros pues
             la cual se incrementará (siempre según la figura)
                                                                            muy pronto los veremos. Ya sabes: www.google.com ;)
             de un byte en un byte, que incrementar la dirección
             que apunta a un número real, que aumentará de
             cuatro en cuatro bytes. Es decir, el puntero "debe
             conocer a qué apunta".                                     2.2.2. Operadores sobre punteros

                                                                        Dos son los principales operadores que se utilizan en relación con
   !             Aunque esta...                                         los punteros:

   Aunque esta explicación no sea muy formal, creo que sirva            & (ampersand)
   para comprender alguno de los comportamientos particulares
   de los punteros.                                                     El operador & nos devuelve la dirección de memoria donde se
                                                                        encuentra una determinada variable.
   No es la primera vez que en esta serie de artículos se
   prescinde del rigor informático en favor de la claridad de           Algunos ejemplos de este operador son:
   la exposición del tema. Por poner un ejemplo, en el esquema
                                                                                var_puntero=&caracter;
   de arriba (ya presente en el anterior artículo) existe un
   gazapo muy sutil. Está relacionado en la manera en como
                                                                                /* El ejemplo visto arriba. A var puntero le asignamos la dirección
   se guardan los números reales en la memoria de un
                                                                                de memoria donde reside caracter. En la figura la variable
   ordenador. Dejo al lector la tarea de encontrar este gazapo.
   En esta búsqueda, espero, aprenderá y comprenderá mucho                      caracter se encuentra en la posición 00, luego var_puntero
   sobre las representaciones de datos en la memoria de una                     contendrá dicha dirección (apuntará a dicha dirección) */
   computadora.                                                                 int cosa1, cosa2;
                                                                                int *pent;
                                                                                pent=&cosa1;
             Tras examinar esta línea llegamos a la conclusión
             de que un puntero se declara siempre según el                      printf("La dirección de cosa1 es %m", &cosa1);
             siguiente esquema:                                                 pent=&cosa2;
                                                                                printf("La dirección de cosa2 es %m y el puntero apunta a %m",&cosa2,pent);
                tipo_dato *nombre_variable_puntero;                             printf("El puntero pent que está en %m apunta a %m", &pent, pent);

             Como vemos es el asterisco precediendo al nombre           * (asterisco)
             de la variable el que convierte a esta en un puntero:
             El asterisco, en el caso de la declaración de variables,   Este operador nada tiene que ver con lo explicado arriba sobre
             es quien dice si la variable es un puntero y no una        como se declara una variable puntero.
             variable normal.

 PC PASO A PASO Nº 13                                                                                                                     Página 21
Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)




            Este operador que precede siempre a una variable                              char *pchar1, *pchar2;
            puntero, nos devuelve el contenido de la dirección                            /* Inicializamos las variables */
            almacenada por el puntero. Ojo: El contenido de la                            vchar1='a';
            dirección almacenada por el puntero. Por poner un                             vchar2='b';
            ejemplo, imaginemos que el código de la figura lo                             /* Inicializamos los punteros */
            cambiamos a:
                                                                                          pchar1=&vchar1;
                      #include <stdio.h>                                                  pchar2=&vchar2;
                         main()                                                           /* Imprimimos información */
                          {                                                               printf("n Tras ejecutar las siguientes instrucciones:nn");
                              char caracter;                                              printf("t033[31;1m vchar1='a';n");
                              char *var_puntero;
                                                                                          printf("t vchar2='b';nn");
                              /* código ignorado por carecer de importancia */
                                                                                          printf("t pchar1=&vchar1;n");
                              caracter=10;
                              var_puntero=&caracter;                                      printf("t pchar2=&vchar2;033[0;0mnn");
                              printf("%c", *var_puntero);                                 printf(" El contenido de las variables y los punterosn");
                          }                                                               printf(" es el siguiente:n");
                                                                                         printf("n 033[34;1m Dir Variable tt ContenidottContenido de lo apuntado 033[0;0m");
            En este programa imprimiremos lo que hay
            almacenado en la dirección que contiene la variable                           printf("n &vchar1 = %x,t vchar1 = %c", &vchar1, vchar1);
            puntero; es decir, en la dirección donde apunta el                            printf("n &vchar2 = %x,t vchar2 = %c", &vchar2, vchar2);
            puntero. Como hemos hecho que el puntero contenga                            printf("n &pchar1 = %x,t pchar1 = %x,t *pchar1 = %c", &pchar1, pchar1, *pchar1);
            la dirección (apunte) de la variable caracter (la
                                                                                         printf("n &pchar2 = %x,t pchar2 = %x,t *pchar2 = %c", &pchar2, pchar2, *pchar2);
            dirección 00 en el diagrama) en la instrucción
                                                                                          printf("n");
            var_puntero=&caracter, el contenido de lo apuntado
            por el puntero será el contenido de la variable a la
                                                                                   }
            que apunta el puntero: el caracter correspondiente
            al decimal 10 (salto de línea).                                        Tras su ejecución, obtendremos una salida similar a esta:

            A este acceso al contenido de una variable mediante                    luis@nostromo:~/hxc/articulo6_el_chaman$ ./ej01
            un puntero se le denomina indirección.
                                                                                   Tras ejecutar las siguientes instrucciones:
            A continuación muestro un pequeño programa que                                vchar1='a';
            puede llegar a facilitar la comprensión de los                                 vchar2='b';
            operadores & y *
                                                                                           pchar1=&vchar1;
            /*
                                                                                           pchar2=&vchar2;
            * Programa: ej01.c
            *                                                                      El contenido de las variables y los punteros es el siguiente:
            * Descripción:
            *    Este programa muestra el comportamiento básico de los punteros.       Dir Variable                   Contenido              Contenido de lo apuntado
            *
            * Compilación:                                                         &vchar1 = bffff9f7,               vchar1 = a
            *      gcc ej01.c -o ej01
            */                                                                     &vchar2 = bffff9f6,                vchar2 = b
            #include <stdio.h>
            main()                                                                 &pchar1 = bffff9f0,                pchar1 = bffff9f7,              *pchar1 = a
            {
                   char vchar1, vchar2;                                            &pchar2 = bffff9ec,                pchar2 = bffff9f6,                  *pchar2 = b



Página 22                                                                                                                                   PC PASO A PASO Nº 13
Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)




   !                 Ejercicio 0.1
                                                                              *
  Ejercicio 0.1                                                               * Compilación:
                                                                              * gcc ej02.c -o ej02
  Teniendo el siguiente código:                                               *
                                                                              */
        /*                                                                   #include <stdio.h>
             * Programa: ej02.c                                              main()
              *
             * Descripción: Segundo ejercicio del artículo 6                 {
              *                                                                       int a,b, *pInt;
             * Compilación:
             * gcc ej02.c -o ej02
              *                                                                           pInt=&a;
              */                                                                          *pInt=3;
             #include <stdio.h>
                                                                                          pInt=&b;
             main()                                                                       *pInt=5;
             {
               int a, b, *pInt;                                                           printf("n a = %i, b = %i n",a,b);
                                                                             }
                 ........
                 ........
                 ........
                 ........
                                                                    2.2.3. Operando con punteros
                 printf("n a = %i, b = %i n", a, b);
             }                                                      Anteriormente hemos mencionado que los punteros
                                                                    se pueden incrementar y decrementar. Cuando
  Sustituir las líneas punteadas por las instrucciones necesarias   hagamos esto tendremos que tener presente que lo
  para que el resultado sea:                                        que se incrementa o decrementa es el contenido del
                                                                    puntero, o dicho de otra forma: una dirección de
                                                                    memoria.
  luis@nostromo:~/hxc/articulo6_el_chaman$ ./ej02
                                                                    Prestemos atención a este código:
   a = 3, b = 5
                                                                    /*
  ¡Ah! Se me olvidaba. Para este ejercicio están prohibidas             * Programa: ej03a.c
  las siguientes instrucciones:                                         *
         a = 3;                                                         * Descripción:
                                                                    *        Muestra el uso de los operadores incremento y decremento
         b = 5;
                                                                        *     con un puntero.
                                                                        *
                                                                        * Compilación:
   !                 Solución del ejercicio                             *     gcc ej03a.c -o ej03a
                                                                        *
   Solución del ejercicio                                               */
                                                                    include <stdio.h>
    /*
                                                                    main()
    * Programa: ej02.c
                                                                    {
    *
                                                                              /* Declaramos las variables necesarias */
     * Descripción: Segundo ejercicio del artículo 6
                                                                              int vector[5];


 PC PASO A PASO Nº 13                                                                                                                   Página 23
Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)




                     int i, *pEntero;                                              * Compilación:
                     /* Llenamos el vector con los números 1, 2, 3, 4 y 5 */       *    gcc ej03b.c -o ej03b
                     for(i=0;i<5;i++)                                              *
                     {                                                             */
                          vector[i]=i+1;                                       #include <stdio.h>
                     }                                                         main()
                     /* Hacemos que el puntero apunte al array */              {
                     pEntero = vector;                                                  /* Declaramos las variables necesarias */
                     printf(" %i n", *pEntero);                                        int vectorE[5];
                     pEntero++; /* Equivale a pEntero = pEntero +1 */                   int i, *pEntero;
                     printf(" %i n", *pEntero);                                        char vectorC[5], *pCaracter;
                     pEntero++;                                                         float vectorR[5], *pReal;
                     printf(" %i n", *pEntero);                                        /* Llenamos los vectores con datos */
                     pEntero++;                                                         for(i=0;i<5;i++)
                     printf(" %i n", *pEntero);                                        {
                     pEntero++;                                                              vectorE[i]=i+1;
                     printf(" %i n", *pEntero);                                             vectorC[i]=i+40;
            }                                                                                vectorR[i]=(float)i*0.1;
                                                                                        }
            En este código lo primero que nos debería de llamar
                                                                                        /* Hacemos que el puntero apunte al array */
            la atención es la instrucción pEntero = vector;. Es
                                                                                        pEntero = vectorE;
            fácil pensar que la instrucción adecuada sería pEntero
                                                                                        pCaracter = vectorC;
            = &vector;. Pero no olvidemos que pEntero es un
                                                                                        pReal    = vectorR;
            puntero que apunta a una variable de tipo entero
            mientras que vector representa un conjunto de                               printf("n Los puntero se incrementarán es:");
            variables de tipo entero que sólo puede accederse                           printf("n pEntero: %i bytes", sizeof(int));
            a ellas a través de los índices.                                            printf("n pCaracter: %i bytes", sizeof(char));
                                                                                        printf("n pReal:      %i bytes", sizeof(float));
            Para rizar más el rizo, el programa sería igual de                          printf("n Cada vez que pongamos "puntero++"n");
            válido si en vez de escribir pEntero = vector;,                             printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal);
            hubiésemos escrito pEntero = &vector[0];.
                                                                                        pEntero++;      /* Equivale a pEntero = pEntero +1 */

            Y esto es porque los vectores y los arrays en general,                      pCaracter++;     /* Equivale a pCaracter = pCaracter +1 */

            a efectos prácticos, son punteros... Y viceversa...                         pReal++;       /* Equivale a pReal     = pReal +1       */
                                                                                        printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal);
            Al ir aumentando de uno en uno el puntero, podría                           pEntero++;
            parecer que estamos incrementando en un byte la                             pCaracter++;
            dirección de memoria, pero el siguiente código nos                          pReal++;
            va a sacar de dudas:
                                                                                        printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal);

                /*                                                                      pEntero++;
                * Programa: ej03b.c                                                     pCaracter++;
                *                                                                       pReal++;
                * Descripción:                                                          printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal);

                * Muestra el uso de los operadores incremento y decremento              pEntero++;
                * con un puntero, así como las peculiaridades de cada tipo              pCaracter++;
                *    de puntero.                                                        pReal++;
                *                                                                       printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal);
                                                                               }

Página 24                                                                                                                          PC PASO A PASO Nº 13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13
Hxc13

Más contenido relacionado

Similar a Hxc13 (20)

Hxc19
Hxc19Hxc19
Hxc19
 
Hxc14
Hxc14Hxc14
Hxc14
 
Hxc16
Hxc16Hxc16
Hxc16
 
Hxc21
Hxc21Hxc21
Hxc21
 
Hxc17
Hxc17Hxc17
Hxc17
 
Hxc23
Hxc23Hxc23
Hxc23
 
Hxc20
Hxc20Hxc20
Hxc20
 
Hxc11
Hxc11Hxc11
Hxc11
 
Hxc10
Hxc10Hxc10
Hxc10
 
Revista Mercadoindustrial.es Nº 73 Mayo 2013
Revista Mercadoindustrial.es Nº 73 Mayo 2013Revista Mercadoindustrial.es Nº 73 Mayo 2013
Revista Mercadoindustrial.es Nº 73 Mayo 2013
 
Hx c19
Hx c19Hx c19
Hx c19
 
1 p decimo rmb
1 p decimo rmb1 p decimo rmb
1 p decimo rmb
 
Users+263 +issuu
Users+263 +issuuUsers+263 +issuu
Users+263 +issuu
 
Hxc9
Hxc9Hxc9
Hxc9
 
Pc world+junio12
Pc world+junio12Pc world+junio12
Pc world+junio12
 
Hxc22
Hxc22Hxc22
Hxc22
 
Realidad Aumentada
Realidad AumentadaRealidad Aumentada
Realidad Aumentada
 
2 p clei 5 inf-rmb
2 p clei 5 inf-rmb2 p clei 5 inf-rmb
2 p clei 5 inf-rmb
 
Hxc2
Hxc2Hxc2
Hxc2
 
Taller Evaluacion
Taller  EvaluacionTaller  Evaluacion
Taller Evaluacion
 

Más de rubenroa

Estudios epidemiologicos
Estudios epidemiologicosEstudios epidemiologicos
Estudios epidemiologicosrubenroa
 
Efectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltaEfectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltarubenroa
 
Causalidad
CausalidadCausalidad
Causalidadrubenroa
 
Evaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasEvaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasrubenroa
 
Epidemiologia
Epidemiologia Epidemiologia
Epidemiologia rubenroa
 
Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1rubenroa
 
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011rubenroa
 
Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011rubenroa
 
Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)rubenroa
 
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1aKappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1arubenroa
 
Uso Racional de Medicamentos
Uso Racional de MedicamentosUso Racional de Medicamentos
Uso Racional de Medicamentosrubenroa
 
tabaquismo
tabaquismotabaquismo
tabaquismorubenroa
 
Sesion ppt -2641_
Sesion ppt -2641_Sesion ppt -2641_
Sesion ppt -2641_rubenroa
 
Auditoria em
Auditoria emAuditoria em
Auditoria emrubenroa
 
Indice tobillo brazo
Indice tobillo brazoIndice tobillo brazo
Indice tobillo brazorubenroa
 
indice tobillo brazo
indice tobillo brazoindice tobillo brazo
indice tobillo brazorubenroa
 
Epistemología y paradigmas
Epistemología y paradigmasEpistemología y paradigmas
Epistemología y paradigmasrubenroa
 
Vertigo acv
Vertigo acvVertigo acv
Vertigo acvrubenroa
 
Apendicectomia
ApendicectomiaApendicectomia
Apendicectomiarubenroa
 

Más de rubenroa (20)

Estudios epidemiologicos
Estudios epidemiologicosEstudios epidemiologicos
Estudios epidemiologicos
 
Efectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante deltaEfectividad de la vacunacion Covid-19 en variante delta
Efectividad de la vacunacion Covid-19 en variante delta
 
Causalidad
CausalidadCausalidad
Causalidad
 
Evaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitariasEvaluacion de tecnologias sanitarias
Evaluacion de tecnologias sanitarias
 
Epidemiologia
Epidemiologia Epidemiologia
Epidemiologia
 
Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1Pediatrics 2008 jul 122(1) 143 8, figure-1
Pediatrics 2008 jul 122(1) 143 8, figure-1
 
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
 
Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011Maceira sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011
 
Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)Datos cohorte chilena sida (1)
Datos cohorte chilena sida (1)
 
Ferinject
FerinjectFerinject
Ferinject
 
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1aKappos fingolimod moa-clin_results_vfinal_buenosaires1a
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
 
Uso Racional de Medicamentos
Uso Racional de MedicamentosUso Racional de Medicamentos
Uso Racional de Medicamentos
 
tabaquismo
tabaquismotabaquismo
tabaquismo
 
Sesion ppt -2641_
Sesion ppt -2641_Sesion ppt -2641_
Sesion ppt -2641_
 
Auditoria em
Auditoria emAuditoria em
Auditoria em
 
Indice tobillo brazo
Indice tobillo brazoIndice tobillo brazo
Indice tobillo brazo
 
indice tobillo brazo
indice tobillo brazoindice tobillo brazo
indice tobillo brazo
 
Epistemología y paradigmas
Epistemología y paradigmasEpistemología y paradigmas
Epistemología y paradigmas
 
Vertigo acv
Vertigo acvVertigo acv
Vertigo acv
 
Apendicectomia
ApendicectomiaApendicectomia
Apendicectomia
 

Último

R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 

Último (20)

R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 

Hxc13

  • 1. HACK X CRACK: “PORT SCANNING” -- APRENDE A ESCANEAR LA RED P A S O P A S Oa a a a a a a aa a a a a a ANALIZANDO EQUIPOS TOS REMOTOS BASES DE DATOS DISEÑO DE FORMULARIOS Y ORGANIZACION PROGRAMANDO VARIABLES Y PUNTEROS Nº 13 -- P.V.P. 4,5 EUROS 00013 8 414090 202756
  • 2. P A S O aa P A S Oaa aa a a aa a a a a a a aa EDITORIAL: EDITOTRANS S.L. Director de la Publicación J. Sentís C.I.F: B43675701 PERE MARTELL Nº 20, 2º - 1ª E-mail contacto 43001 TARRAGONA (ESPAÑA) director@hackxcrack.com Director Editorial Diseño gráfico: I. SENTIS J. M. Velasco E-mail contacto director@editotrans.com E-mail contacto: Título de la publicación Los Cuadernos de HACK X CRACK. grafico@hackxcrack.com Nombre Comercial de la publicacíón PC PASO A PASO Redactores Web: www.hackxcrack.com AZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO, Dirección: PERE MARTELL Nº 20, 2º - 1ª. ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE, 43001 TARRAGONA (ESPAÑA) ZORTEMIUS, AK22, DORKAN, KMORK, MAILA, TITINA, SIMPSIM... ... ... ... ... ¿Quieres insertar publicidad en PC PASO A Contacto redactores PASO? Tenemos la mejor relación precio-difusión redactores@hackxcrack.com del mercado editorial en España. Contacta con nosotros!!! Colaboradores Mas de 130 personas: de España, de Brasil, de Director de Marketing Argentina, de Francia, de Alemania, de Japón y Sr. Miguel Mellado algún Estadounidense. Tfno. directo: 652 495 607 Tfno. oficina: 877 023 356 E-mail: miguel@editotrans.com E-mail contacto colaboradores@hackxcrack.com Imprime I.G. PRINTONE S.A. Tel 91 808 50 15 DISTRIBUCIÓN: SGEL, Avda. Valdeparra 29 (Pol. Ind.) 28018 ALCOBENDAS (MADRID) Tel 91 657 69 00 FAX 91 657 69 28 WEB: www.sgel.es TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80 Petición de Números atrasados y Suscripciones (Srta. Genoveva) HORARIO DE ATENCIÓN: DE 9:30 A 13:30 (LUNES A VIERNES) © Copyright Editotrans S.L. NUMERO 13 -- PRINTED IN SPAIN PERIOCIDAD MENSUAL Deposito legal: B.26805-2002 Código EAN: 8414090202756
  • 3.
  • 4. EDITORIAL PREPARANDO EL FUTURO Cuando uno forma parte de un proyecto, como por ejemplo la publicación de una revista, debe preocuparse tanto de los mil y un problemas diarios como de “el futuro”. Hasta hace muy poco, PC PASO A PASO (Los Cuadernos de Hack x Crack), ha sido publicada siguiendo una filosofía tipo “vivir al día”, algo que 4 EDIT ORIAL está muy bien en los inicios pero que no debe 5 XML:DOM mantenerse demasiado tiempo. 14 C OLAB ORA C ON NOSO TR OS Ahora estamos preparando toda una serie de cambios cuyos resultados empezarán a “verse” en poco tiempo, 1 6 PR OGRAMA CION BA JO LINUX: LENGU A JE C desde la Web hasta la revista… nuevos contenidos, publicidad, más páginas, nuevos colaboradores y, 27 CURSO VISUAL BASIC: UN CLIENTE, UNA NECESIDAD(I). sobre todo, mayor diversidad en las temáticas. 38 SERIE RAW (7): HTTP (I) Hasta ahora nos hemos centrado en temas relacionados con la Seguridad Informática orientada a Internet y 5 8 S E RV I D O R D E H XC . M O D O D E E M P L EO hemos intentado “picar” al lector para que empiece a programar. Ambos temas RED y CURSOS seguirán 66 C ONCURSO DE SUSE LINUX 8.2 siendo los principales pilares de PC PASO A PASO, 6 6 B A JAT E N U E S T R O S L O G O S Y M E L O D I A S pero estamos trabajando duro para ofrecer mucho más… tiempo al tiempo :) 66GANADOR DEL CONCURSO DE SUSE LINUX Para nosotros está siendo muy difícil “madurar”, sería 66 SUSCRIPCIONES sencillo tomar una línea tipo “análisis de productos” y ganar de esta forma publicitantes y lectores tipo 67 NUMER OS ATRAS ADOS “PC ACTUAL”, de hecho, hay publicaciones en el mercado cuyas ventas ni siquiera cubren el precio de la Imprenta pero que tienen importantes beneficios por la publicidad. Nosotros estamos trabajando en la cuadratura del círculo, seguiremos con nuestra temática y la ampliaremos, seguiremos siendo educativos en lugar de destructivos, pero empezaremos a diversificar y, sobre todo, aumentar páginas. Esperamos poder demostrar todo este trabajo (que hasta ahora permanece “en la sombra”) para los primeros meses del próximo año. Tratar la temática Hack es tratar la Seguridad Informática, al contrario de lo que muchos piensan ambas cosas son exactamente lo mismo. Algunos creyeron que era imposible hacer una revista de este tipo sin caer en la vulgaridad y sin “empujar” al lector a cometer todo tipo de actos ilícitos, se equivocaron… si algo hemos hecho es enseñar y educar hasta la saciedad. GRACIAS POR LEERNOS
  • 5. MANIPULACION DE DOCUMENTOS XML: EL DOM Primera parte: Teoria del DOM e interfaz DOMDocument Por Joaquim Roca Verges XML es una apuesta segura. El común de los mortales lo utilizamos cada día sin saberlo y es un estándar universal implementada en cualquier aplicación que se precie. Hasta ahora hemos visto lo que es el xml (nº10) y archivo Power Designer versión 7. lo que son las DTD (nº 11 y 12). Recordamos que el XML es un lenguaje de intercambio de datos, que Hará cosa de un año, fui a una presentación Microsoft hoy en día es prácticamente universal (todo el de una herramienta BizTalk que sirve para procesar mundo lo entiende), y las DTD son reglas que podéis archivos generados con SAP. Los archivos generados aplicar al XML. Ahora vamos a ver como procesar, con SAP se guardaban... en formato XML. como recorrer, como extraer la información de los documentos XML. ! Para quien se... Y lo vamos a hacer con el DOM. Para quien se esté preguntando qué es eso del SAP, le damos otro Para daros ánimos e intentar inculcaros mi par de siglas: ERP y CMR. Un ERP es, para que nos entendamos, entusiasmo me gustaría explicaros un par de las un programa de gestión empresarial, pero no un "programita" muchas experiencias favorables y satisfactorias que tipo "facturación/nominas", sino todo un sistema de gestión he tenido con este lenguaje. integral, para que te hagas una idea, los bancos y grandes Hace poco estuve diseñando una base de datos multinacionales utilizan sistemas tipo ERP para gestionar desde bastante grande conjuntamente con otra empresa los datacenters (centros de datos que pueden llegar a ocupar varias que llamaremos XXX. Nos reuníamos semanalmente plantas de un edificio e incluso varios edificios) hasta la sucursal con los usuarios y fruto de las conversaciones con de un pequeño pueblo o un simple punto de venta. Alguno estará ellos íbamos diseñando la base de datos. El diseño pensando como es posible "instalar" un ERP (algo tan se hacia con Power Designer (podéis bajároslo de aparentemente "grande") en un punto de venta (por ejemplo en http://crm.sybase.com/sybase/www/eBD/my_03/ un pequeño McDonals), pues bien, es posible porque un sistema pd952_dwnld_eval.jsp una vez os hayáis registrado), ERP contiene infinidad de pequeños módulos especialmente una herramienta de modelado de base de datos de adaptados para cada una de las áreas que puede tener una empresa. la casa Sybase. La empresa XXX utilizaba Power Pero un ERP es mucho más, porque permite a las empresas Designer 7, y mi empresa disponía de Power Designer ampliar, personalizar e incluso crear módulos completamente 8 y 9. nuevos que se adapten perfectamente a cualquier tarea. Pero lo verdaderamente importante no es ni su capacidad ni su Si la empresa XXX hacia modificaciones y nos las modularidad, lo realmente importante es que un ERP permite un mandaba a mi empresa ningún problema ya que análisis global y en tiempo real de cualquier aspecto de una las versiones 8 y 9 entendían a la perfección la empresa, desde una visión financiera de alto nivel (activos/pasivos versión 7, sin embargo si nosotros hacíamos globales de toda una multinacional) hasta las ventas en la última modificaciones ellos no podían abrir nuestros hora de una diminuta sucursal de un pequeño pueblo de Murcia. documentos. Pues bien, SAP es uno de los ERP más difundidos. Microsoft, Lo solucionamos guardando nuestras modificaciones como no podía ser menos, compró una empresa especializada en como archivo XML, y entonces sí, entonces el colega la creación de Software tipo ERP y comercializa su producto ERP de la empresa XXX cogía el XML y lo convertía a un bajo el nombre de AXAPTA-NAVISION. Y nos queda el CMR, PC PASO A PASO Nº 13 Página 5
  • 6. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM <DOCUMENTO> <!-- solo se mostrará a partir de la una del mediodía --> que para no extendernos más diremos que es un importante <BIENVENIDA hora="13:00"> Hola, buenas tardes </BIENVENIDA> módulo del Sistema ERP que se encarga de "los contactos", </DOCUMENTO> vamos, como el Outlook pero a lo grande ;p (espero que se capte la ironía, comparar Outlook con un CMR es de tan mal gusto este comentario también formaría parte del DOM. como comparar el vinagre con un buen vino :) Y (atención!!) el texto "Hola, buenas tardes" también es parte del No creo que en esta revista se trate nunca en profundidad los DOM sistemas ERP, de hecho, la temática que rodea al mundo de los ERPs es tan basta que daría para hacer una revista solo dedicada El DOM es el conjunto de todos los componentes (elementos, a ello. Lo malo es que, como todo lo bueno, apenas vendería un atributos, comentarios, entidades, texto...) que conforman el millar de ejemplares… aunque la cosa quizá está cambiando… documento XML. hasta hace poco únicamente las grandes corporaciones podían acceder a un sistema de este calibre (no solo por el precio, sino Todos estos componentes se denominan objetos. por lo complejo de su puesta en marcha, implantación, gestión, mantenimiento…); pero actualmente las empresas que crean este Por ejemplo, si nuestro PC fuera un documento XML, el DOM estaría tipo de productos están haciendo un guiño a las medianas e incluso formado por el disco duro, la memoria, el procesador, la pantalla, pequeñas empresas sacando al mercado "mini-ERPs" diseñados la frecuencia de la pantalla.... específicamente para determinados sectores empresariales. El DOM es independiente del lenguaje de programación con el que Con esta nota, simplemente pretendemos abrir un poco tus estemos trabajando. Podemos acceder al DOM XML tanto con Java, horizontes. Los usuarios de informática muchas veces creemos como con Visual Basic, C, JavaScript... conocer los programas más importantes/difundidos, pero seguro que muy pocos lectores habrán instalado alguna vez un ERP en Está basado en lo que se denomina interfaz de nodos = un su ordenador. Si tenemos en cuenta que los ERP dominan el conjunto de métodos (funciones) y propiedades para los objetos mundo y que son los programas utilizados por las grandes (elementos, comentarios, atributos, entidades... del documento empresas/instituciones… ¿cómo es posible que la inmensa mayoría XML) DOM. de los usuarios no tengan/tengamos ni idea del tema?... Desde aquí te invitamos a que investigues sobre ello ;) El DOM es una vista estructurada de un documento XML. Podemos verlo como un árbol, y sus hojas: Una estructura de tipo árbol y las hojas se llaman nodos. ¿QUE ES EL DOM? Recordemos el XML de ordenes de compra: DOM = Document Object Model, es decir modelo de objetos del documento xml. <?xml versión="1.0" standalone="yes"?> <ORDEN_DE_COMPRA> Hemos visto que un XML puede ser lo siguiente: <CLIENTE> <DOCUMENTO> <NUMERO_DE_CUENTA>12345678</NUMERO_DE_CUENTA> <BIENVENIDA> Hola, buenas tardes </BIENVENIDA> <NOMBRE_COMPLETO> </DOCUMENTO> <NOMBRE>Sam</NOMBRE> <APELLIDO1>Bass</APELLIDO1> Pues el modelo de objetos de este documento estaría formado por <APELLIDO2></APELLIDO2> TODOS los elementos que lo componen, o sea por el elemento </NOMBRE_COMPLETO> DOCUMENTO, y por el elemento BIENVENIDA y si por ejemplo el </CLIENTE> elemento BIENVENIDA tuviera un atributo que se llamara "hora": </ORDEN_DE_COMPRA> <DOCUMENTO> Los elementos, comentarios, atributos, entidades, texto <BIENVENIDA hora="13:00"> Hola, buenas tardes </BIENVENIDA> etc. que contiene el documento xml , se denominan todos </DOCUMENTO> como NODOS, así tenemos que <NOMBRE> es un NODO y "Sam" es otro NODO. también sería parte del DOM, y si hubiéramos escrito un comentario: Y el conjunto de NODOS con sus funciones (lo que podemos Página 6 PC PASO A PASO Nº 13
  • 7. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM hacer sobre los nodos) y propiedades se denomina INTERFAZ DE NODOS. Y ve á m o s l o r e p r e s e n t a d o c o m o u n c o n j u n t o d e n o d o s que dibujaremos con elipses, y su contenido(el texto) q u e re p r e s e n t a r e m o s c o n n o d o s re c t á n g u l o s ( e s u s u a l dibujarlo todo en rectángulos, pero he preferido hacer esta primera aproximación de esta manera): Si esto fuese un objeto Visual Basic, nos gustaría ser capaces de manipular estos nodos, y leer y manipular sus valores. El objeto Visual Basic que contiene el documento xml se llama DocumentObject y los nodos son una matriz de objetos de tipo NODE. Con lo que la instrucción DocumentObject.Node (index).value nos proporciona el valor de un nodo en particular. Y esto es básicamente lo que el DOM (Document Object Model) XML hace: carga en memoria el documento (con todos sus nodos) y accede, modifica, añade, elimina… Pero no nos adelantemos. TIPOS DE NODOS QUE PUEDE CONTENER UN DOCUMENTO XML Todos los nodos comparten propiedades y métodos comunes, pero dependiendo del tipo de nodo que sea, tiene unas propiedades y métodos particulares. PC PASO A PASO Nº 13 Página 7
  • 8. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM Cuando estemos programando el DOM, podremos Los elementos y el Texto, se tratan con las tres primeras interfaces hacer referencia al nodo indicando el tipo de nodo (DOMDocument, XMLDOMNode y XMLDOMNodeList) (NODE_ ATTRIBUTE por ejemplo) o a su valor Los atributos, no son hijos de ningún otro elemento, sino que númerico (2 para el NODE_ ATTRIBUTE) forman parte de un elemento. Como caracterizan a un elemento, es decir describen características de un elemento, son diferentes Siguiendo el ejemplo anterior: a los otros nodos, no están considerados como hijos de ningún padre y se tratan con la interfaz XMLDOMNamedNodeMap Serían NODE_ELEMENT: INTERFAZ DOMDocument <ORDEN_DE_COMPRA>;<CLIENTE>;<NUMERO _DE_CUENTA>;<NOMBRE_COMPLETO>;<NOMB Es la interfaz del objeto documento (nodo documento), que RE>; <APELLIDO1> y <APELLIDO2> incorpora propiedades y métodos para trabajar con el nodo raíz del DOM. Serían NODE_TEXT: "Sam" Y "Bass" El nodo raíz del DOM representa TODO el documento XML y no lo debemos confundirlo con el elemento raíz del documento. Si miráis el diagrama de nodos que hemos dibujado antes, podéis ¿CÓMO MANIPULAMOS EL ARCHIVO observar el nodo raíz del DOM arriba del todo, con la leyenda XML. XML CON EL DOM? Seguidamente y colgando de el podéis ver el elemento raíz del documento que seria el nodo ORDEN_DE_COMPRA. Para manipular un documento XML, lo primero que tenemos que hacer es cargarlo en la memoria de Vamos a irlo viendo todo con un ejemplo. nuestro ordenador con un parser XML. Nosotros Cread en la raíz de vuestro sistema de archivos una carpeta que utilizaremos el parser de Microsoft: el Msxml, tal se llame xmlDom ("C:xmlDom") como ya hicimos en el ejemplo de la primera entrega (nº 10). Primero crearemos un DTD, contra el cual se validará nuestro xml. Una vez el documento está en memoria, ya lo Abrid un editor de texto y escribid: podemos manipular utilizando el DOM <!ELEMENT ORDEN_DE_COMPRA (CLIENTE)> <!ELEMENT CLIENTE (NUMERO_DE_CUENTA,NOMBRE_COMPLETO)> El DOM, trata el documento XML como un árbol. El DocumentElement es el elemento superior o raíz <!ELEMENT NUMERO_DE_CUENTA ( #PCDATA)> <!ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, APELLIDO2) > del árbol. Este elemento raíz puede tener uno o <!ELEMENT NOMBRE (#PCDATA)> mas nodos (nodes) hijos (child) que representarían <!ELEMENT APELLIDO1 (#PCDATA)> las hojas del árbol. <!ELEMENT APELLIDO2 (#PCDATA)> Una interfaz, como hemos avanzado antes es un Guardad el archivo como ordenCompra.dtd dentro de la carpeta conjunto de métodos (funciones) y propiedades xmlDom para los objetos (elementos, comentarios, atributos, entidades... del documento XML) DOM. Abrid de nuevo el editor de texto y escribid Para acceder a los objetos del dom (los nodos del <?xml version "1.0" standalone="no" ?> DOM) disponemos de cuatro interfaces principales, "ordenCompra.dtd"> que trataremos una a una a continuación: <ORDEN_DE_COMPRA> <CLIENTE> 1. DOMDocument <NUMERO_DE_CUENTA>12345678</NUMERO_DE_CUENTA> 2. XMLDOMNode <NOMBRE_COMPLETO> 3. XMLDOMNodeList <NOMBRE>Sam</NOMBRE> 4. XMLDOMNamedNodeMap <APELLIDO1>Bass</APELLIDO1> <APELLIDO2></APELLIDO2> Para la mayoría de documentos XML, los tipos de </NOMBRE_COMPLETO> nodos más comunes son: </CLIENTE> • Elementos </ORDEN_DE_COMPRA> • Atributos • Texto y guardad el archivo como Compra.xml Página 8 PC PASO A PASO Nº 13
  • 9.
  • 10. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM Abrid el Visual Basic y cread un proyecto nuevo tal '**************Escribid******************** y como indicamos en el nº 10 (asumimos que tenéis Dim xmlDocument As DOMDocument conocimientos básicos de visual basic): esto es Dim xmlString as String • Abrid el Visual Basic Dim blnValido As Boolean • Seleccionar un Standard exe Set xmlDocument = New DOMDocument • Añadid una referencia al DOM. Para ello '**************************************** seleccionar del menú PROYECTO la opción REFERENCIAS. • Cargar el documento xml en memoria, en el objeto de • Buscad una que pone Microsoft XML, v3.0 tipo DOMDocument (método load()), asignarle algunas propiedades y seleccionarla, haciendo click en el y comprobar que está bien formado. cuadradito que hay a la izquierda de modo que quede marcado. Y dadle al botón de '**************Escribid******************** Aceptar (yo lo tengo en inglés podéis ver 'Antes de cargarlo en memoria, damos valor a alguna de sus propiedades: que en la pantalla se puede leer OK.) 'primero le indicamos que se ejecute de manera síncrona, esto es que se ejecute 'inmediatamente, que se cargue inmediatamente xmlDocument.async = False 'le indicamos que se valide contra el DTD xmlDocument.validateOnParse = True 'y si hay referencias externas, que las resuelva. Por ejemplo, controlar que el DTD que 'referenciamos existe donde le indicamos, en el path que le indicamos. xmlDocument.resolveExternals = True 'si el documento es valido, el método Load que es el carga el documento devolverá un valor true, en caso contrario un valor false blnValido= xmlDocument.Load ("C:XmlDomCompra.xml") if blnValido then MsgBox "El documento es válido" Else MsgBox "El documento no cumple con el DTD" Exit sub End If '**************************************************** Fijaros que el nombre de la referencia es a la dll ! Nota aclaratoria msxml3. Cuando asignamos un valor a una variable: A. DOMDocument CARGAR DEL DOCUMENTO, Dim i as integer CREAR UN NUEVO DOCUMENTO XML I= 8 Lo que estamos diciéndole al ordenador es: Colocad un botón en el formulario, id a las Dim i as integer => Resérvame un espacio en memoria para un tipo integer propiedades y poner: I= 8 => En el espacio que me has reservado, colócame un 8 • name = cmdCargar • caption = &Cargar En el ejemplo, cuando escribimos Dim xmlDocument As DOMDocument documento xml Set xmlDocument = New DOMDocument xmlDocument.Load ("C:XmlDomCompra.xml") Codificad el evento click del Lo que estamos diciendo al ordenador es: botón: Dim xmlDocument As DOMDocument Set xmlDocument = New DOMDocument =>resérvame un • Estas líneas de código espacio en memoria para un tipo DomDocument lo que hacen es crear un xmlDocument.Load ("C:XmlDomCompra.xml") => ponme en objeto de tipo el espacio reservado el archivo Compra.xml DOMDocument: Página 10 PC PASO A PASO Nº 13
  • 11. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM • Pedimos que nos muestre el texto del xml en un mensaje: B. DOMDocument ACCEDER AL ARBOL DESDE EL ELEMENTO RAIZ, '**************Escribid******************** CONTENIDO DE UN NODO EN MsgBox xmlDocument.Text '**************************************** PARTICULAR Si todo va bien, os mostrará el siguiente Podemos acceder al árbol del DOM, empezando por message box, con todo el texto del la raíz y navegando hacia abajo del árbol (de el documento: nodo mas externo al mas interno) o bien podemos hacer una consulta de un nodo en particular. • Vamos a Crear el documento Navegaremos desde el elemento raíz utilizando la xml Compras2.xml de manera dinámica, propiedad del domdocument documentElement , con el método LoadXML que nos devuelve el elemento raíz, convertido en un objeto de tipo XMLDOMNode (un objeto de la '**************Escribid*********** interfaz XMLDOMNode). 'Ponemos todo el texto del xml en una variable de tipo String 'Fijaros en que he sustituido las dobles comillas de ‘version, de standalone y de la ubicación del dtd por ‘comillas simples ! Al igual que... xmlString = "<?xml version='1.0' standalone='no' ?>" & _ al igual que una propiedad nos puede devolver un valor de " <!DOCTYPE ORDEN_DE_COMPRA SYSTEM 'C:XmlDomordenCompra.dtd'> "&_ tipo booleano, también nos puede devolver un valor de " <ORDEN_DE_COMPRA> " & _ tipo objeto de una clase. En este caso nos devuelve un " <CLIENTE> " & _ " <NUMERO_DE_CUENTA>87654321</NUMERO_DE_CUENTA> " & _ objeto de la interfaz documentElement. Por eso hemos " <NOMBRE_COMPLETO> " & _ tenido que declarar una variable de este tipo. Veréis este " <NOMBRE>Pat</NOMBRE> " & _ tipo de asignaciones muy frecuentemente cuando trabajéis " <APELLIDO1>Garret</APELLIDO1> " & _ con el Dom. " <APELLIDO2></APELLIDO2> " & _ " </NOMBRE_COMPLETO> " & _ " </CLIENTE> " & _ Necesitaremos pues, referenciar de alguna manera " </ORDEN_DE_COMPRA>" la interfaz IXMLDOMElement (el DOM tiene mas interfaces que las cuatro principales; esta se utiliza 'el método loadXML carga en memoria, en el dom, la cadena que le pasamos para nodos de tipo elemento. Es una ampliación de de XMLDomNode) y la interfaz XMLDOMNode. Lo xmlDocument.loadXML xmlString haremos con dos variables de estos tipos. (Mirad MsgBox xmlDocument.Text el ejemplo) '**************************************************** Para navegar por el documento, vamos a crear un El texto del segundo mensaje será distinto, ahora os saldrá. nuevo DTD y un nuevo XML muy parecidos a los que hemos estado utilizando hasta ahora. • Finalmente, Guardamos el archivo Vamos a cambiar solamente el nodo raíz, vamos a xml generado, con un nombre distinto, hacer que ORDEN_DE_COMPRA cuelgue de un nuevo con el método save elemento que llamaremos PEDIDOS. Y ampliaremos la información que puede tener ORDEN_DE_COMPRA añadiéndole el elemento PRODUCTO. '**************Escribid******************************** 'el método save guarda el documento generado o modificado. Finalmente vamos a indicar a ORDEN_DE_COMPRA xmlDocument.save ("C:XmlDomCompra2.xml") que tiene puede tener mas de un orden de compra 'liberamos memoria con el signo +. On Error Resume Next Set xmlDocument = Nothing '**************************************************** Abrid un editor de texto y escribid: PC PASO A PASO Nº 13 Página 11
  • 12. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM <!ELEMENT PEDIDOS (ORDEN_DE_COMPRA+)> Codificad el evento click del botón: <!ELEMENT ORDEN_DE_COMPRA (CLIENTE, PRODUCTO)> <!ELEMENT CLIENTE (NUMERO_DE_CUENTA,NOMBRE_COMPLETO)> Private Sub cmdArbolDoc_Click() <!ELEMENT PRODUCTO (#PCDATA)> Dim xmlDocument As DOMDocument <!ELEMENT NUMERO_DE_CUENTA ( #PCDATA)> Dim raizDocumento As IXMLDOMElement <!ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, APELLIDO2) > Dim nodohijo As IXMLDOMNode <!ELEMENT NOMBRE (#PCDATA)> Dim xmlString As String <!ELEMENT APELLIDO1 (#PCDATA)> Set xmlDocument = New DOMDocument <!ELEMENT APELLIDO2 (#PCDATA)> 'síncrono, externas y DTD xmlDocument.async = False Guardad el archivo como pedidos.dtd 'le indicamos que se valide contra el DTD Abrid de nuevo el editor de texto y escribid: xmlDocument.validateOnParse = True 'y si hay referencias externas, que las resuelva. <?xml version="1.0" standalone="no" ?> xmlDocument.resolveExternals = True <!DOCTYPE PEDIDOS SYSTEM If xmlDocument.Load("C:xmlDompedidos.xml") Then "pedidos.dtd"> MsgBox "El documento es válido" <PEDIDOS> Else <ORDEN_DE_COMPRA> MsgBox "El documento no cumple con el DTD" <CLIENTE> Exit Sub End If <NUMERO_DE_CUENTA>12345678</NUMERO_DE_CUENTA> 'le decimos que raizDocumento = PEDIDOS <NOMBRE_COMPLETO> Set raizDocumento = xmlDocument.documentElement <NOMBRE>Sam</NOMBRE> 'Navegamos por los nodos hijos del elemento raíz <APELLIDO1>Bass</APELLIDO1> For Each nodohijo In raizDocumento.childNodes <APELLIDO2></APELLIDO2> MsgBox nodohijo.Text </NOMBRE_COMPLETO> Next </CLIENTE> 'liberamos la memoria <PRODUCTO>LIBRO</PRODUCTO> On Error Resume Next </ORDEN_DE_COMPRA> Set nodohijo = Nothing <ORDEN_DE_COMPRA> Set raizDocumento = Nothing <CLIENTE> Set xmlDocument = Nothing <NUMERO_DE_CUENTA>987654321</NUMERO_DE_CUENTA> End Sub <NOMBRE_COMPLETO> <NOMBRE>Jesse</NOMBRE> Fijaros en los dos mensajes que os han salido por <APELLIDO1>James</APELLIDO1> pantalla: <APELLIDO2></APELLIDO2> </NOMBRE_COMPLETO> </CLIENTE> Seguido de <PRODUCTO>DISCO DE VINILO</PRODUCTO> </ORDEN_DE_COMPRA> </PEDIDOS> Vamos a interpretarlo. Volved al Visual Basic Colocad un botón en el formulario, id a las propiedades y poner: El DOM, ha leído el primer nodo que contenía el • name = cmdArbol nodo raíz. El nodo raíz es PEDIDOS, y el texto que • caption = &árbol del documento xml ha leído el DOM es el texto que tenia su primer nodo hijo ORDEN_DE_COMPRA, y el texto que tenia su primer nodo hijo era TODO el texto que contenía ORDEN_DE_COMPRA. ¿Y cual es todo el texto que tiene el primer nodo ORDEN_DE_COMPRA?, pues nada más y nada menos Página 12 PC PASO A PASO Nº 13
  • 13. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM que el texto que tienen todos sus nodos hijos: Si lo entendéis, si os ha entrado bien en la cabeza, • 12345678 lo tenéis muy pero que muy bien. • Sam Para consultar un nodo en particular, podemos • Bass utilizar el método getElementsByTagName que • LIBRO devuelve todos los nodos elemento de un tag en concreto. Devuelve un array que contiene todos los Y para el segundo nodo ORDEN_DE_COMPRA lo elementos del documento que tienen ese nombre. mismo, todo el texto que tienen todos sus nodos Recordad que un tag es otra manera de llamar a un hijos: elemento: Al elemento <ORDEN_DE_COMPRA> • 987654321 también podéis llámalo tag <ORDEN_DE_COMPRA> • Jesse • James Volved al Visual Basic • DISCO DE VINILO Colocad un botón en el formulario, id a las propiedades y poner: Para verlo mas claro, pensemos en el explorador • name = cmdUnElemento de windows. • caption = &Un elemento concreto del árbol Supongamos esta estructura de directorios: Codificad el evento click del botón: Private Sub cmdUnElemento_Click() Dim ListaDeNodos As IXMLDOMNodeList Dim xmlDocument As New DOMDocument Dim i As Integer xmlDocument.async = False xmlDocument.validateOnParse = True xmlDocument.resolveExternals = True If xmlDocument.Load("C:xmlDompedidos.xml") Then MsgBox "El documento es válido" Else MsgBox "El documento no cumple con el DTD" Exit Sub End If Supongamos que ordenCompra tiene un archivo MsgBox xmlDocument.xml que se llama 12345678.txt Set ListaDeNodos = xmlDocument.getElementsByTagName("NOMBRE") Supongamos que Apellido1 tiene un archivo que se For i = 0 To (ListaDeNodos.length - 1) llama Sam.txt MsgBox ListaDeNodos.Item(i).xml Supongamos que Apellido2 tiene un archivo que se MsgBox ListaDeNodos.Item(i).Text llama Bass.txt Next Supongamos que Producto tiene un archivo que se On Error Resume Next llama LIBRO.txt Set ListaDeNodos = Nothing Set xmlDocument = Nothing Y pedimos al Sistema Operativo que nos liste todos End Sub los archivos que contiene la carpeta Pedidos.... Efectivamente nos devolverá lo mismo que nos ha Utilizamos la interfaz IXMLDOMNodeList, interfaz devuelto el DOM de XML. que nos permite trabajar con la lista de nodos del Pararos un segundo en pensar y analizar este código. DOM, tal como su nombre indica. PC PASO A PASO Nº 13 Página 13
  • 14. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM Fijaros en que el atributo xmlDocument.xml os a true, preserva los espacios en blanco del documento devuelve el contenido de todo el xml, y el atributo • ReadyState = nos indica el estado en que del ListaDeNodos.Item(i).xml nos devuelve también se encuentra el documento en este momento. Por el contenido de todo el xml que contiene ese nodo, ejemplo el documento puede hallarse en estado y así como el atributo xmlDocument.text nos LOADING (cargando) o en estado COMPLETE (carga devuelve el contenido de texto de todo el documento completa y el DOM disponible) xml, el atributo de la interfaz ixmldomnodelist ListaDeNodos.Item(i).text también nos devuelve el • url = devuelve una cadena (string) que nos informa de la url de Internet donde se halla texto del nodo que hemos seleccionado. nuestro xml Con ello os quiero demostrar que aunque son interfaces diferentes, el comportamiento es el mismo, Los métodos mas importantes de la interfaz si encontráis en alguna otra interfaz las propiedades DomDocument, son los que hemos visto (load, xml, o text, sin hacer ninguna prueba ya podéis loadXML, getElementsbyTagName y Save) y saber lo que devuelve. los de creación de fragmento de xml. Supongamos que queremos añadir otro C. DOMDocument CREAR UN ORDEN_DE_COMPRA a nuestro xml: el modo de FRAGMENTO DE XML hacerlo es creando un nuevo nodo ORDEN_DE_COMPRA de acuerdo con el DTD(con Hemos visto hasta ahora las principales propiedades todos sus nodos hijos tal como se especifica en el de la interfaz DomDocument, pero no todas. Las DTD) y una vez creado lo insertaremos en el otras propiedades son informativas del documento: documento xml. El tiempo en que este nuevo nodo esta desvinculado • Doctype= devuelve el tipo de documento de nuestro documento XML, tiempo en el que le asociado al xml, en nuestro ejemplo nos devolvería estamos añadiendo sus nodos hijos es el tiempo de el dtd. creación de un fragmento xml, que es un trozo • PreserveWhiteSpace = que si ponemos de xml a anexar al xml principal. ¿QUIERES COLABORAR CON PC PASO A PASO? PC PASO A PASO busca personas que posean conocimientos de informática y deseen publicar sus trabajos. SABEMOS que muchas personas (quizás tu eres una de ellas) han creado textos y cursos para “consumo propio” o “de unos pocos”. SABEMOS que muchas personas tienen inquietudes periodísticas pero nunca se han atrevido a presentar sus trabajos a una editorial. SABEMOS que hay verdaderas “obras de arte” creadas por personas como tu o yo y que nunca verán la luz. PC PASO A PASO desea contactar contigo! NOSOTROS PODEMOS PUBLICAR TU OBRA!!! SI DESEAS MÁS INFORMACIÓN, envíanos un mail a empleo@editotrans.com y te responderemos concretando nuestra oferta. Página 14 PC PASO A PASO Nº 13
  • 15. XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM - XML - DOM Todo nuevo nodo se construye con los métodos de con los métodos la interfaz DOMdocument que comienzan con la palabra create+tipodenodo. Por ejemplo para • InsertBefore crear un nodo de tipo elemento haremos createElement, y para crear un atributo haremos • RemoveChild createAttribute etc. • ReplaceChild Veremos un ejemplo de cómo crear un nuevo nodo, Listado de métodos create que se utilizan en el próximo capítulo, cuando tratemos la interfaz para crear un fragmento xml: XMLDOMNode ya que es necesaria para "enganchar" un nodo hijo a su padre, por ejemplo <NOMBRE_COMPLETO> a <CLIENTE>, o para borrar • CreateAttribute un nodo hijo, necesitaremos de muchas de las • CreateCDATASection propiedades y métodos que tiene esta interfaz • CreateComment • CreateDocumentFragment Tenéis la lista completa de propiedades y métodos de DOMDocument en la dirección: • CreateElement • CreateEntityReference http://msdn.microsoft.com/library/default.asp?url • CreateNode =/library/en-us/xmlsdk30/htm/ • CreateProcessingInstruction xmobjxmldomdocument.asp • CreateTextNode ¡Saludos compañeros! también podemos, sustituir, insertar los nodos
  • 16. Programacion en GNU/LiNUX Desarrollo de aplicaciones en entornos UNiX e iniciaciaon al lenguaje C (II) el_chaman. Luis U. Rodriguez Paniagua Este mes, en nuestra entrega habitual de LINUX entraremos en el temido mundo de los punteros en C (entre otras cosas). Coged aire y ADELANTE!!! 1. Introducción. 2.1. Arrays o vectores A casi todos nos sonará el término vector de haberlo visto en En el artículo anterior vimos como a la hora de matemáticas. Allí considerábamos un vector o arreglo como una realizar un proyecto en un entorno UNiX se suele colección de bloques de datos. En la programación sucederá algo emplear una modularización del mismo para mejorar similar: Un array o vector será una colección de datos del mismo la productividad. Así mismo comenzamos una breve tipo. introducción al lenguaje C que enlazaba con las Además de esta definición, surgen dos términos asociados al estructuras de control de dicho lenguaje vistas en término vector: la dimensión y el índice el primer artículo de esta serie. Para entender qué es un vector y cómo funcionan estos dos nuevos conceptos, vamos a imaginarnos lo siguiente: Este artículo, tal vez por la necesidad de la temática, está orientado a la práctica. Se propondrán Tal como vimos en el anterior número podemos definir las variables algunos ejercicios y búsqueda de información, que como cajas en las que meter datos. Así mismo vimos que los tipos espero hagan de su lectura y estudio un tema de dichas variables nos decían de qué tamaño eran dichas cajas. ameno. Dicho esto podremos definir un vector como un conjunto de cajas Continuando con lo visto, hoy seguiremos viendo del mismo tamaño colocadas en fila. El índice será la posición de algunos de los tipos disponibles en C. En el número una determinada caja dentro de estas cajas y la dimensión será anterior se quedaron en el tintero los tipos derivados cómo podemos colocar en el espacio las distintas filas, columnas, debido a que he considerado que el tema de los etc... que formarán la geometría de este conjunto de cajas. punteros, vectores y matrices, merece un tratamiento más profundo que el de los tipos básicos. Y sin entretenernos más pasemos ya a los tipos /* Ejemplo de declaración de varios tipos de vectores o arrays */ derivados. /* Vector unidimensional de números enteros */ int un_vector[5]; 2. Tipos Derivados. /* Vector bidimensional o matriz de números reales */ Los tipos derivados serán aquellos que se generen float una_matriz[5][5]; a partir de los tipos fundamentales o de otros tipos /* Vector tridimensional de caracteres */ derivados. Nosotros veremos los arrays o vectores, char un_cubo[5][5][5]; punteros, estructuras, uniones y campos de bits. Página 16 PC PASO A PASO Nº 13
  • 17. Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II)- Como podemos observar en el ejemplo, la declaración Así por ejemplo, para introducir datos en una casilla de un vector corresponde al siguiente esquema: teclearemos algo como: tipo_array nombre_array[dim1][dim2]..[dimN] un_vector[0] = 34; Donde tipo_array será el tipo de datos que contiene un_vector[1] = 2 + 3; el array (es decir el tamaño de cada una de las una_matriz[2][3] = 3.1416 * 34; cajas que lo componen), nombre_array será el un_cubo[0][2][1] = 'a'; nombre que demos al array y [dimX] será el tamaño tope de cada una de las dimensiones, o dicho de Para acceder al contenido se hará de manera similar: otro modo: el número máximo de cajas que se int suma; admite en una dimensión. char respuesta; ... Para entender mejor el concepto de dimensión, suma = un_vector[0] + un_vector[1]; representemos gráficamente el código arriba visto: printf("%f", una_matriz[2][3]); ... printf(" Teclee una letra: "); scanf("%c", &respuesta); if( un_cubo[0][2][1]==respuesta) printf("Ha pulsado una a"); ! No se intente... No se intente buscar sentido alguno a los dos últimos ejemplos: Están hechos con la intención de mostrar el acceso a los componentes de un array. Fíjense en cómo se acceden a los datos, no en lo que se hace con ellos. Este será un tema que trataremos a lo largo del curso. En el primer ejemplo mostramos como introducir datos en casillas concretas de los distintos arrays dependiendo del tipo de estos, y en el segundo caso mostramos como sacar datos de dichos arrays. A continuación vamos a hacer un programa que cree una matriz de dimensión 3x4 (tres filas y cuatro Observando el gráfico arriba expuesto, accederemos columnas) y la llene de con sus coordenadas de la al contenido de cada casilla mediante sus siguiente manera: El número almacenado en cada coordenadas. Obsérvese algo muy importante: En casilla mostrará en su parte entera el número de C, siempre los índices empiezan a contar desde 0. fila, y en su parte decimal en número de columna. Esto quiere decir que si declaramos un vector con Así las segunda casilla de la primera fila contendrá cinco casillas, a la hora de poner su dimensión un 0.1 (Recordemos que las coordenadas empiezan pondremos int un_vector[5] pero a la hora de a contar en C siempre desde 0). acceder a todas sus casillas pondremos un_vector[0], /* un_vector[1], un_vector[2], un_vector[3] y * Programa: ej00.c un_vector[4] siendo el número total de casillas * cinco, pero siendo el valor máximo del índice una * Descripción: Crea una matriz de dimensión 3x4, llena cada casilla unidad menor que la dimensión total del vector. * con sus coordenadas de la siguiente manera: PC PASO A PASO Nº 13 Página 17
  • 18. Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II) * _____ _____ _____ _____ representar las coordenadas de la casilla en un único * |_0.0_|_0.1_|_0.2_|_0.3_| número. Puesto de otra forma: * |_1.0_|_1.1_|_1.2_|_1.3_| matriz[num_fila][num_col]= num_fila + (num_col * 0.1); * |_2.0_|_2.1_|_2.2_|_2.3_| * Así para la casilla matriz[0][2] tendremos que su * e imprime el contenido de la matriz por pantalla. contenido será 0 + ( 0.2 ) = 0.2. * * Compilación: Hasta ahí todos de acuerdo. Ahora bien: ¿ Qué * gcc ej00.c -o ej00 significa eso de poner (float) delante de las variables contadoras i y j?. */ #include <stdio.h> A esto se le denomina casting y consiste en main() transformar el tipo del resultado que nos devuelve { una operación cuyos operadores son den tipo distinto /* Declaración de la matriz de tres filas por cuatro columnas */ a quien va a recibir el dato. Dicho de otra manera: /* Tiene que ser de números reales */ Sirve para cambiar el tipo de un dato en tiempo de float matriz[3][4]; ejecución. /* Declaración de variables auxiliares contadoras */ Si prestamos atención a la línea de la que estamos int i,j; hablando, veremos que los operadores son de tipo /* Llenamos la matriz con datos */ entero, pero no así el resultado que esperamos /* i contará filas */ conseguir tras la operación. Es por ello que ese for(i=0;i<3;i++) resultado lo tenemos que convertir a real. En próximos { ejemplos veremos más usos del casting. /* j contará columnas dentro de cada fila */ for(j=0;j<4;j++) 2.1.1. Ejercicio 0.0 { Se desea hacer un juego del tres en raya para dos matriz[i][j]= (float)(i + (j * 0.1)); jugadores humanos muy sencillo. Las posibles } pantallas a mostrar a lo largo del juego pueden ser } las siguientes: /* Imprimimos la matriz */ for(i=0;i<3;i++) ___|___|___ _X_|___|___ { for(j=0;j<4;j++) ___|___|___ ___|_O_|___ { ___|___|___ ___|___|_O_ printf(" %1.1f ",matriz[i][j]); } Se pide además que el estado del tablero actual se /* Después de imprimir una fila, debemos de saltar una línea*/ conserve en una matriz de dimensión 3x3 de números printf("n"); enteros. } Entrada y Salida } La entrada y la salida en C se realizan habitualmente En este programa de ejemplo, debemos de abundar sobre los dispositivos de entrada estándar ( stdin ) en una línea un tanto extraña: y salida estándar ( stdout). Tradicionalmente se asocia la entrada estándar al teclado y la salida matriz[i][j]= (float)(i + (j * 0.1)); estándar a la pantalla de la consola, pero esto no tiene porqué ser así siempre. Ya trataremos con En un principio puede parecer que efectivamente ficheros y veremos que stdin y stdout no son más estamos empleando la fórmula adecuada para que dos de los muchos flujos de datos que podremos Página 18 PC PASO A PASO Nº 13
  • 19. Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II) emplear en un programa. que estamos tratando : A efectos prácticos nosotros consideraremos por Tabla 1. Formatos de tipos de dato ahora que la entrada estándar (stdin) es el teclado y tiene una función de lectura asociada llamada scanf y que la salida estándar (stdout) es la consola del ordenador y tiene asociada la función printf. En conclusión: La lectura de datos del teclado se hará mediante scanf y la impresión de datos en la pantalla de la consola se hará mediante printf. Un ejemplo de lectura de datos puede ser: int coor_x, coor_y; ... printf("n Deme la coordenada X: ") scanf("%i",&coor_x); printf("n Deme la coordenada Y: "); scanf("%i",&coor_y); ... Para estos formatos podemos también especificar el Observese el & que ponemos delante de la variable ancho de caracteres reservados para expresar un donde queremos depositar el dato leído por teclado. número. Asi %5i reservaría 5 caracteres para imprimir Al término del artículo de hoy seremos capaces de un número entero, independientemente de la longitud comprender qué significa ese & y por qué lo ponemos de este. %5.2f reservaría 5 caracteres para imprimir ahí. Por ahora baste decir que estamos depositando la parte entera y dos para la parte decimal, etc... el dato leído en la posición de memoria donde se Obsérvese también, que debemos de poner la cadena encuentra la variable donde queremos que se guarde de formato en el lugar exacto donde queremos que dicho dato. se imprima el dato, y, posteriormente una lista de Un ejemplo de impresión de datos puede ser: variables que irán en el mismo orden el que queremos que aparezca el dato. int var_entera=3; float var_real=3.14; Dadas las siguientes variables: char cadena[8]="Hola0"; int varA=3; char var_char='a'; float varB=4; printf("Valores: %i, %f, %s, %c. ", var_entera, var_real, cadena, var_char); char varC[6]="Hola0"; A la hora de imprimir el contenido de una variable, char varD='e'; (o de leerlo, observar el ejemplo anterior de scanf, Serán ejemplos correctos: tenemos que decir de alguna manera a las funciones printf(" %3i ", varA); de lectura o escritura de datos por entrada y salida estándar respectivamente ( scanf y printf ) qué es scanf("%f",&varB); lo que van a leer o escribir. Para ello se emplean printf("Una cadena: %s y un real: %3.6f ",varC, varB); printf("Una letra %c y un número: %i", varD, varA); las cadenas de formato. Las cadenas de formato printf("Una letra %c y otra letra %c", varD, varC[1]); son esas letras que comienzan por % y que en printf("Decimal: %i, Octal: %o, Hexadecimal: %x ", varA, varA, varA); función de su valor, indican el tipo de dato con el PC PASO A PASO Nº 13 Página 19
  • 20. Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II) E incorrectos: Prescindiendo de esa oscura mitología y de historias printf(" %i ", varC); espeluznantes que se cuentan relacionadas con los scanf("%f",&varA); mismos, trataremos de presentar los punteros de printf("Una cadena: %s y un real: %f ",varD, varA); una manera clara y asequible, de manera que les printf("Una letra %c y un número: %i", varA, varD); perdamos el miedo pero nunca el respeto, dado que printf("Una letra %c y otra letra %c", varD, varC); son una de las herramientas más potentes que nos printf("Decimal: %i, Octal: %o, Hexadecimal: %x ", varA) suministra el lenguaje C. Además de las cadenas de formato, printf admite 2.2.1. ¿Qué son los punteros?: una serie de caracteres no imprimibles o secuencias Desmitificando al monstruo de estape como son: Un puntero no es más que una variable que cuyo Tabla 2. Secuencias de escape para printf contenido, en vez de datos, son direcciones de memoria. Dicho de otra forma: Hasta ahora utilizábamos las variables para guardar cantidades numéricas, caracteres o cadenas de texto. Ahora utilizaremos un tipo especial de variable que será capaz de guardar una dirección de memoria. Contemplemos el siguiente esquema que nos resultará familiar del anterior artículo (PC PASO A PASO 12): El programa debe se capaz de verificar cuando se ha hecho tres en línea y cuándo ha habido tablas. Así mismo debe de verificar que las coordenadas están dentro del rango permitido y el turno de cada jugador. 2.2. Punteros Los punteros suelen ser el caballo de batalla al que se enfrentan los programadores que se adentran por primera vez en lenguajes como C o Pascal. Página 20 PC PASO A PASO Nº 13
  • 21. Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II) En la primera línea resaltada char *var_puntero;, Otros ejemplos de declaración de punteros serán: lo que hacemos es declarar una variable de tipo puntero que es capaz de apuntar a int *p_entero; direcciones de memoria (es decir, es capaz float *p_real; de guardar direcciones de memoria), que contengan un dato char. Esto puede causar char *p_caracter; confusión dado que si sabemos que los punteros contienen direcciones de memoria, ¿qué necesidad hay de asociarlos un tipo? Esta pregunta, ! Existe un tipo de... que en principio puede parecer compleja, queda explicada cuando más adelante veamos que como el resto de las variables podemos realizar operaciones Existe un tipo de puntero denominado void que virtualmente aritméticas con el contenido de las mismas, como en conjunción con el casting es capaz de apuntar a cualquier por ejemplo el incremento. Claro que no es lo mismo tipo de variable o dirección de memoria. Recomiendo que incrementar una dirección que apunta a caracteres el lector investigue por su cuenta este tipo de punteros pues la cual se incrementará (siempre según la figura) muy pronto los veremos. Ya sabes: www.google.com ;) de un byte en un byte, que incrementar la dirección que apunta a un número real, que aumentará de cuatro en cuatro bytes. Es decir, el puntero "debe conocer a qué apunta". 2.2.2. Operadores sobre punteros Dos son los principales operadores que se utilizan en relación con ! Aunque esta... los punteros: Aunque esta explicación no sea muy formal, creo que sirva & (ampersand) para comprender alguno de los comportamientos particulares de los punteros. El operador & nos devuelve la dirección de memoria donde se encuentra una determinada variable. No es la primera vez que en esta serie de artículos se prescinde del rigor informático en favor de la claridad de Algunos ejemplos de este operador son: la exposición del tema. Por poner un ejemplo, en el esquema var_puntero=&caracter; de arriba (ya presente en el anterior artículo) existe un gazapo muy sutil. Está relacionado en la manera en como /* El ejemplo visto arriba. A var puntero le asignamos la dirección se guardan los números reales en la memoria de un de memoria donde reside caracter. En la figura la variable ordenador. Dejo al lector la tarea de encontrar este gazapo. En esta búsqueda, espero, aprenderá y comprenderá mucho caracter se encuentra en la posición 00, luego var_puntero sobre las representaciones de datos en la memoria de una contendrá dicha dirección (apuntará a dicha dirección) */ computadora. int cosa1, cosa2; int *pent; pent=&cosa1; Tras examinar esta línea llegamos a la conclusión de que un puntero se declara siempre según el printf("La dirección de cosa1 es %m", &cosa1); siguiente esquema: pent=&cosa2; printf("La dirección de cosa2 es %m y el puntero apunta a %m",&cosa2,pent); tipo_dato *nombre_variable_puntero; printf("El puntero pent que está en %m apunta a %m", &pent, pent); Como vemos es el asterisco precediendo al nombre * (asterisco) de la variable el que convierte a esta en un puntero: El asterisco, en el caso de la declaración de variables, Este operador nada tiene que ver con lo explicado arriba sobre es quien dice si la variable es un puntero y no una como se declara una variable puntero. variable normal. PC PASO A PASO Nº 13 Página 21
  • 22. Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II) Este operador que precede siempre a una variable char *pchar1, *pchar2; puntero, nos devuelve el contenido de la dirección /* Inicializamos las variables */ almacenada por el puntero. Ojo: El contenido de la vchar1='a'; dirección almacenada por el puntero. Por poner un vchar2='b'; ejemplo, imaginemos que el código de la figura lo /* Inicializamos los punteros */ cambiamos a: pchar1=&vchar1; #include <stdio.h> pchar2=&vchar2; main() /* Imprimimos información */ { printf("n Tras ejecutar las siguientes instrucciones:nn"); char caracter; printf("t033[31;1m vchar1='a';n"); char *var_puntero; printf("t vchar2='b';nn"); /* código ignorado por carecer de importancia */ printf("t pchar1=&vchar1;n"); caracter=10; var_puntero=&caracter; printf("t pchar2=&vchar2;033[0;0mnn"); printf("%c", *var_puntero); printf(" El contenido de las variables y los punterosn"); } printf(" es el siguiente:n"); printf("n 033[34;1m Dir Variable tt ContenidottContenido de lo apuntado 033[0;0m"); En este programa imprimiremos lo que hay almacenado en la dirección que contiene la variable printf("n &vchar1 = %x,t vchar1 = %c", &vchar1, vchar1); puntero; es decir, en la dirección donde apunta el printf("n &vchar2 = %x,t vchar2 = %c", &vchar2, vchar2); puntero. Como hemos hecho que el puntero contenga printf("n &pchar1 = %x,t pchar1 = %x,t *pchar1 = %c", &pchar1, pchar1, *pchar1); la dirección (apunte) de la variable caracter (la printf("n &pchar2 = %x,t pchar2 = %x,t *pchar2 = %c", &pchar2, pchar2, *pchar2); dirección 00 en el diagrama) en la instrucción printf("n"); var_puntero=&caracter, el contenido de lo apuntado por el puntero será el contenido de la variable a la } que apunta el puntero: el caracter correspondiente al decimal 10 (salto de línea). Tras su ejecución, obtendremos una salida similar a esta: A este acceso al contenido de una variable mediante luis@nostromo:~/hxc/articulo6_el_chaman$ ./ej01 un puntero se le denomina indirección. Tras ejecutar las siguientes instrucciones: A continuación muestro un pequeño programa que vchar1='a'; puede llegar a facilitar la comprensión de los vchar2='b'; operadores & y * pchar1=&vchar1; /* pchar2=&vchar2; * Programa: ej01.c * El contenido de las variables y los punteros es el siguiente: * Descripción: * Este programa muestra el comportamiento básico de los punteros. Dir Variable Contenido Contenido de lo apuntado * * Compilación: &vchar1 = bffff9f7, vchar1 = a * gcc ej01.c -o ej01 */ &vchar2 = bffff9f6, vchar2 = b #include <stdio.h> main() &pchar1 = bffff9f0, pchar1 = bffff9f7, *pchar1 = a { char vchar1, vchar2; &pchar2 = bffff9ec, pchar2 = bffff9f6, *pchar2 = b Página 22 PC PASO A PASO Nº 13
  • 23. Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II) ! Ejercicio 0.1 * Ejercicio 0.1 * Compilación: * gcc ej02.c -o ej02 Teniendo el siguiente código: * */ /* #include <stdio.h> * Programa: ej02.c main() * * Descripción: Segundo ejercicio del artículo 6 { * int a,b, *pInt; * Compilación: * gcc ej02.c -o ej02 * pInt=&a; */ *pInt=3; #include <stdio.h> pInt=&b; main() *pInt=5; { int a, b, *pInt; printf("n a = %i, b = %i n",a,b); } ........ ........ ........ ........ 2.2.3. Operando con punteros printf("n a = %i, b = %i n", a, b); } Anteriormente hemos mencionado que los punteros se pueden incrementar y decrementar. Cuando Sustituir las líneas punteadas por las instrucciones necesarias hagamos esto tendremos que tener presente que lo para que el resultado sea: que se incrementa o decrementa es el contenido del puntero, o dicho de otra forma: una dirección de memoria. luis@nostromo:~/hxc/articulo6_el_chaman$ ./ej02 Prestemos atención a este código: a = 3, b = 5 /* ¡Ah! Se me olvidaba. Para este ejercicio están prohibidas * Programa: ej03a.c las siguientes instrucciones: * a = 3; * Descripción: * Muestra el uso de los operadores incremento y decremento b = 5; * con un puntero. * * Compilación: ! Solución del ejercicio * gcc ej03a.c -o ej03a * Solución del ejercicio */ include <stdio.h> /* main() * Programa: ej02.c { * /* Declaramos las variables necesarias */ * Descripción: Segundo ejercicio del artículo 6 int vector[5]; PC PASO A PASO Nº 13 Página 23
  • 24. Linux - Programación en C (II) - Linux - Programación en C (II) - Linux - Programación en C (II) int i, *pEntero; * Compilación: /* Llenamos el vector con los números 1, 2, 3, 4 y 5 */ * gcc ej03b.c -o ej03b for(i=0;i<5;i++) * { */ vector[i]=i+1; #include <stdio.h> } main() /* Hacemos que el puntero apunte al array */ { pEntero = vector; /* Declaramos las variables necesarias */ printf(" %i n", *pEntero); int vectorE[5]; pEntero++; /* Equivale a pEntero = pEntero +1 */ int i, *pEntero; printf(" %i n", *pEntero); char vectorC[5], *pCaracter; pEntero++; float vectorR[5], *pReal; printf(" %i n", *pEntero); /* Llenamos los vectores con datos */ pEntero++; for(i=0;i<5;i++) printf(" %i n", *pEntero); { pEntero++; vectorE[i]=i+1; printf(" %i n", *pEntero); vectorC[i]=i+40; } vectorR[i]=(float)i*0.1; } En este código lo primero que nos debería de llamar /* Hacemos que el puntero apunte al array */ la atención es la instrucción pEntero = vector;. Es pEntero = vectorE; fácil pensar que la instrucción adecuada sería pEntero pCaracter = vectorC; = &vector;. Pero no olvidemos que pEntero es un pReal = vectorR; puntero que apunta a una variable de tipo entero mientras que vector representa un conjunto de printf("n Los puntero se incrementarán es:"); variables de tipo entero que sólo puede accederse printf("n pEntero: %i bytes", sizeof(int)); a ellas a través de los índices. printf("n pCaracter: %i bytes", sizeof(char)); printf("n pReal: %i bytes", sizeof(float)); Para rizar más el rizo, el programa sería igual de printf("n Cada vez que pongamos "puntero++"n"); válido si en vez de escribir pEntero = vector;, printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal); hubiésemos escrito pEntero = &vector[0];. pEntero++; /* Equivale a pEntero = pEntero +1 */ Y esto es porque los vectores y los arrays en general, pCaracter++; /* Equivale a pCaracter = pCaracter +1 */ a efectos prácticos, son punteros... Y viceversa... pReal++; /* Equivale a pReal = pReal +1 */ printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal); Al ir aumentando de uno en uno el puntero, podría pEntero++; parecer que estamos incrementando en un byte la pCaracter++; dirección de memoria, pero el siguiente código nos pReal++; va a sacar de dudas: printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal); /* pEntero++; * Programa: ej03b.c pCaracter++; * pReal++; * Descripción: printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal); * Muestra el uso de los operadores incremento y decremento pEntero++; * con un puntero, así como las peculiaridades de cada tipo pCaracter++; * de puntero. pReal++; * printf(" %i, %c, %f n", *pEntero, *pCaracter, *pReal); } Página 24 PC PASO A PASO Nº 13