SlideShare una empresa de Scribd logo
1 de 120
Descargar para leer sin conexión
UNIVERSIDAD TECNICA DE MANABÍ
   FACULTAD DE CIENCIAS INFORMATICAS




ESTRUCTURA DE DATOS I

      PROGRAMACIÓN EN C++




      “Lo importante en un individuo, no es lo
            que piensa, sino lo que hace”
                                    J. Watson




     FACULTAD DE CIENCIAS INFORMATICAS

                      FCI - 2008
               Autores:
                        Ing. Esthela San Andres
                         Ing. Christian Torres
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas




                         ESTRUCTURA DE DATOS I
                                       PROGRAMACIÓN EN C++

Sistema de Información
Introducción.-            Un sistema de información es un conjunto de elementos que interactúan entre sí
con el fin de apoyar las actividades de una empresa o negocio.

El equipo computacional: el hardware necesario para que el sistema de información pueda operar.

El recurso humano que interactúa con el Sistema de Información, el cual está formado por las personas
que utilizan el sistema.


Un sistema de información realiza cuatro actividades básicas: entrada, almacenamiento, procesamiento y
salida de información.



Entrada de Información: Es el proceso mediante el cual el Sistema de Información toma los datos que
requiere para procesar la información. Las entradas pueden ser manuales o automáticas. Las manuales
son aquellas que se proporcionan en forma directa por el usuario, mientras que las automáticas son datos
o información que provienen o son tomados de otros sistemas o módulos. Esto último se denomina
interfases automáticas.



Las unidades típicas de entrada de datos a las computadoras son las terminales, las cintas magnéticas,
las unidades de diskette, los códigos de barras, los escáners, la voz, los monitores sensibles al tacto, el
teclado y el mouse, entre otras.

Almacenamiento de información: El almacenamiento es una de las actividades o capacidades más
importantes que tiene una computadora, ya que a través de esta propiedad el sistema puede recordar la
información guardada en la sección o proceso anterior. Esta información suele ser almacenada en
estructuras de información denominadas archivos. La unidad típica de almacenamiento son los discos
magnéticos o discos duros, los discos flexibles o diskettes y los discos compactos (CD-ROM).



Procesamiento de Información: Es la capacidad del Sistema de Información para efectuar cálculos de
acuerdo con una secuencia de operaciones preestablecida. Estos cálculos pueden efectuarse con datos
introducidos recientemente en el sistema o bien con datos que están almacenados. Esta característica de
los sistemas permite la transformación de datos fuente en información que puede ser utilizada para la
toma de decisiones, lo que hace posible, entre otras cosas, que un tomador de decisiones genere una
                                                                                                                ESTRUCTURADE DATOS I -- FCI




proyección financiera a partir de los datos que contiene un estado de resultados o un balance general de
un año base.



Salida de Información: La salida es la capacidad de un Sistema de Información para sacar la información
procesada o bien datos de entrada al exterior. Las unidades típicas de salida son las impresoras,
terminales, diskettes, cintas magnéticas, la voz, los graficadores y los plotters, entre otros. Es importante
aclarar que la salida de un Sistema de Información puede constituir la entrada a otro Sistema de
Información o módulo. En este caso, también existe una interfase automática de salida. Por ejemplo, el
Sistema de Control de Clientes tiene una interfase automática de salida con el Sistema de Contabilidad, ya
que genera las pólizas contables de los movimientos procesales de los clientes.

    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                            1
Universidad Tecnica de Manabí                       Facultad de Ciencias Informaticas

                               A continuación se muestran las diferentes actividades que puede realizar un Sistema de Información de
                               Control de Clientes:



                               Actividades que realiza un Sistema de Información:
                               Entradas:

                                   • Datos generales del cliente: nombre, dirección, tipo de cliente, etc.
                                   • Políticas de créditos: límite de crédito, plazo de pago, etc.
                                   • Facturas (interfase automático).
                                   • Pagos, depuraciones, etc.
                               Proceso:

                                  • Cálculo de antigüedad de saldos.
                                  • Cálculo de intereses moratorios.
                                  • Cálculo del saldo de un cliente.
                               Almacenamiento:

                                   •      Movimientos del mes (pagos, depuraciones).
                                   •      Catálogo de clientes.
                                   •      Facturas.


                               Salidas:

                                   •      Reporte de pagos.
                                   •      Estados de cuenta.
                                   •      Pólizas contables (interfase automática)
                                   •      Consultas de saldos en pantalla de una terminal.


                               Las diferentes actividades que realiza un Sistema de Información se pueden observar en el diseño
                               conceptual ilustrado en la en la figura 1.1.
ESTRUCTURA DE DATOS I -- FCI




                                                       Actividades que realiza un Sistema de Información, figura 1.1




                         2      Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

Tipos y Usos de los Sistemas de Información
         Durante los próximos años, los Sistemas de Información cumplirán tres objetivos básicos dentro
de las organizaciones:

    1. Automatización de procesos operativos.
    2. Proporcionar información que sirva de apoyo al proceso de toma de decisiones.
    3. Lograr ventajas competitivas a través de su implantación y uso.


Los Sistemas de Información que logran la automatización de procesos operativos dentro de una
organización, son llamados frecuentemente Sistemas Transaccionales, ya que su función primordial
consiste en procesar transacciones tales como pagos, cobros, pólizas, entradas, salidas, etc. Por otra
parte, los Sistemas de Información que apoyan el proceso de toma de decisiones son los Sistemas de
Soporte a la Toma de Decisiones, Sistemas para la Toma de Decisión de Grupo, Sistemas Expertos de
Soporte a la Toma de Decisiones y Sistema de Información para Ejecutivos. El tercer tipo de sistema, de
acuerdo con su uso u objetivos que cumplen, es el de los Sistemas Estratégicos, los cuales se desarrollan
en las organizaciones con el fin de lograr ventajas competitivas, a través del uso de la tecnología de
información.




        Los tipos y usos de los Sistemas de Información se muestran en la figura 1.2.



A continuación se mencionan las principales características de estos tipos de Sistemas de Información.



        Sistemas Transaccionales. Sus principales características son:

    •   A través de éstos suelen lograrse ahorros significativos de mano de obra, debido a que
        automatizan tareas operativas de la organización.
                                                                                                               ESTRUCTURADE DATOS I -- FCI




    •   Con frecuencia son el primer tipo de Sistemas de Información que se implanta en las
        organizaciones. Se empieza apoyando las tareas a nivel operativo de la organización.

    •   Son intensivos en entrada y salid de información; sus cálculos y procesos suelen ser simples y
        poco sofisticados.

    •   Tienen la propiedad de ser recolectores de información, es decir, a través de estos sistemas se
        cargan las grandes bases de información para su explotación posterior.

    •   Son fáciles de justificar ante la dirección general, ya que sus beneficios son visibles y palpables.




    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                           3
Universidad Tecnica de Manabí                         Facultad de Ciencias Informaticas

                                     Sistemas de Apoyo de las Decisiones. Las principales características de estos son:

                                 •   Suelen introducirse después de haber implantado los Sistemas Transaccionales más relevantes de
                                     la empresa, ya que estos últimos constituyen su plataforma de información.

                                 •   La información que generan sirve de apoyo a los mandos intermedios y a la alta administración en
                                     el proceso de toma de decisiones.

                                 •   Suelen ser intensivos en cálculos y escasos en entradas y salidas de información. Así, por ejemplo,
                                     un modelo de planeación financiera requiere poca información de entrada, genera poca
                                     información como resultado, pero puede realizar muchos cálculos durante su proceso.

                                 •   No suelen ahorrar mano de obra. Debido a ello, la justificación económica para el desarrollo de
                                     estos sistemas es difícil, ya que no se conocen los ingresos del proyecto de inversión.

                                 •   Suelen ser Sistemas de Información interactivos y amigables, con altos estándares de diseño
                                     gráfico y visual, ya que están dirigidos al usuario final.

                                 •   Apoyan la toma de decisiones que, por su misma naturaleza son repetitivos y de decisiones no
                                     estructuradas que no suelen repetirse. Por ejemplo, un Sistema de Compra de Materiales que
                                     indique cuándo debe hacerse un pedido al proveedor o un Sistema de Simulación de Negocios
                                     que apoye la decisión de introducir un nuevo producto al mercado.

                                 •   Estos sistemas pueden ser desarrollados directamente por el usuario final sin la participación
                                     operativa de los analistas y programadores del área de informática.

                                 •   Este tipo de sistemas puede incluir la programación de la producción, compra de materiales, flujo
                                     de fondos, proyecciones financieras, m od el os d e si mul aci ón de n eg oci os, mod el os d e
                                     in v enta r ios, etc .



                                     Sistemas Estratégicos. Sus principales características son:

                                 •   Su función primordial no es apoyar la automatización de procesos operativos ni proporcionar
                                     información para apoyar la toma de decisiones.

                                 •   Suelen desarrollarse in house, es decir, dentro de la organización, por lo tanto no pueden
                                     adaptarse fácilmente a paquetes disponibles en el mercado.

                                 •   Típicamente su forma de desarrollo es a base de incrementos y a través de su evolución dentro de
                                     la organización. Se inicia con un proceso o función en particular y a partir de ahí se van agregando
                                     nuevas funciones o procesos.

                                 •   Su función es lograr ventajas que los competidores no posean, tales como ventajas en costos y
                                     servicios diferenciados con clientes y proveedores. En este contexto, los Sistema Estratégicos son
                                     creadores de barreras de entrada al negocio. Por ejemplo, el uso de cajeros automáticos en los
                                     bancos en un Sistema Estratégico, ya que brinda ventaja sobre un banco que no posee tal servicio.
                                     Si un banco nuevo decide abrir sus puertas al público, tendrá que dar este servicio para tener un
                                     nivel similar al de sus competidores.
ESTRUCTURA DE DATOS I -- FCI




                                 •   Apoyan el proceso de innovación de productos y proceso dentro de la empresa debido a que
                                     buscan ventajas respecto a los competidores y una forma de hacerlo en innovando o creando
                                     productos y procesos.




                         4     Manual de Estructura de Datos
Universidad Tecnica de Manabí                                Facultad de Ciencias Informaticas

Tipos de datos
       Bit. U nid ad de in fo rm ac ió n más s e nci ll a en el s istem a bi na r io.

        B yte. Un idad d e i nf o r maci ón qu e c onst a d e 8 bits e qu i va le nt e a u n ú ni co
        car áct er , c omo un a let r a, n úm er o o si gn o d e p untu aci ó n.

        Ca ráct e r. Es u n el em ent o to mad o d e u n con ju nto d e s ímb ol os . E jem p lo :
        a,b,c,0 ,1,%= …

        Pa lab r a. C o nju nt o d e bi ts q ue p ue de n s e r ma ni pu lad o s p o r u na c om pu tado ra .

        La l o ngit ud de u na p a lab ra e n un a c om put a do ra p ue de se r: 8, 16 , 31, etc.
        De p end e d e l Mic r op r oc esad o r

Manipulación de bits

        Digit al iz aci ó n de la in f or mac ió n. Se c o nv i ert e te xt o, so ni do o
        imág e nes e n f o rmat o q ue p ue de s e r ent e ndid o p or l a PC.

        Los m ic ro p ro ces ad or es ent ie nd en e l f o rmat o d e 0,1´s .

        Los m ic ro p r oc esad o res det ect an cu and o un b it s e c ar ga y su
        va lo r es igu al a 1

        Se p u ed en r e pr es ent a r u na g ran di v e rsid ad de va l or es:             ve rd a d y fa lso,
        fem en in o y m ascu li n o, etc.

        La e fic i enc ia d e las pc´ s no se basa e n l a c om pl ej id ad d e s u l óg ica

        La e fic i enc ia d e las pc´ s se b asa en la v e loc id ad d e t rab aj o.

                  Ej em p lo de co mbi nac io nes p osib l es: 2 bits , 8 bits

        Si s e uti li zan 8 bits pa ra re p r ese nta r u n ca rá cte r, se pu ed en re p r es ent ar h asta
        256 ca ract e res d if e re n tes, p u esto qu e ex iste n 256 p at ro n es o co m bina ci on es
        dif e re ntes d e 8 b its.

        Los com p utad o res d if i e re n co n r es pe cto a l núm er o d e bits uti li zad os p a ra
        r ep r es enta r un ca ráct e r

Clasificación de los tipos de datos

        En fu nc ió n d e qu i en los def in e:

             o   Ti p os d e d atos está nd a r.

             o   Ti p os d e d atos de fi nid o s p or e l us ua r io

        En fu nc ió n d e l a r ep r es ent aci ón int e rn a:

                 Ti p os d e d atos esc al ar es o sim p les
                                                                                                                  ESTRUCTURADE DATOS I -- FCI




             o

             o   Ti p os d e d atos est ruct u rad os.

        Los ti p os d e d atos sim pl es s on l os si gui e ntes :

             ◦    Numé r ic os ( Int eg e r, R e al ) ·

             ◦    Lóg icos ( B oo le an ) ·

             ◦    Ca ráct e r (C ha r, St ri ng ) ·



    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                              5
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

                               Representación de datos simples

                                      Dato. R e pr es ent aci ón f or ma d e hec hos , c onc e ptos o inst r ucci o nes

                                      Ti p o de dat o. Un co nj u nto d e va l or es, a q ue ll o s qu e p ue de to ma r cua lq ui e r dat o
                                      de d ich o t ip o.

                                      Las va r iab les y co nsta ntes qu e fo rm an pa rte de un p r og ram a p e rte nec e n a u n
                                      ti p o de d a t os d et er mi nad o. De esta f or ma, los va l or es as oci ad o s a dichas
                                      va r iab les (o co nsta ntes ) p ue de n o pe r ar c on ot r os d e ac ue rd o a s u nat ur al ez a ( p .
                                      e. d os nú me r os e nte r o s pu ed en s e r mu lti pl ic ados p er o n o ti e ne s e ntid o ha ce r
                                      esa o pe r aci ón co n c ad e nas d e c a ract e res ).

                                      NU M ER O S EN T ER O S

                                                Si ut ili za mos 32 bits pa ra re p r ese nta r nú me ro ent e ros, dis p on em o s d e
                                                2^32 c ombi nac io n es d i fe r ent es d e 0 y 1`s:

                                               4294967 296 va l or es.

                                               C omo te n em os qu e r ep r es enta r núm e ro n egat i vos y e l c e ro:

                                                -2 147 483 6 48 a l +2 147 483 647

                                      NU M ER O S R E A L ES .

                                      (+|-) mantisa x 2 e x p o n e n t e

                                      En l a not aci ó n d el pu nto fl ota nt e u n nú me r o r eal es tá r e p res e nta do p o r u na
                                      hil e ra d e 32 bits f o rma da p o r un a ma ntisa d e 24 bits seg uid a de un ex p on ent e
                                      de 8 bits.

                                      La bas e se f ij a com o 10. Ta nt o la m ant isa como el e x po ne nt e son ent e ro s
                                      bina r ios de co mp l em en to d obl e.



                               Tipos de datos abstractos

                                      Un tipo de datos abstracto – TDA defi n e u na nu e va c las e de ob j eto o c onc e pt o
                                      qu e p ue de ma ne ja rs e co n i nd e pe nd enc ia de la est ruct u ra de datos p a ra
                                      r ep r es enta r lo .

                                      Pa r a e ll o es nec es ar io es pec if ica r:

                                      Las o p e rac io n es qu e s e pu ed e r ea li za r c on l os obj etos .

                                      El e fe cto q ue se p r odu c e a l a ctua r c o n l as o p e rac io n es so br e los mis mos.

                                      . U n TD A enc a psu la la d efi ni ci ón de l ti p o y t oda s l as o pe r aci on es c o n e ste ti p o.
ESTRUCTURA DE DATOS I -- FCI




                                      Los l en gua j es de p ro gr amac ió n e ntr eg an al pr og ram ad or c ie rt os ti po s de dat o s
                                      básic os o pr imit i vos, e sp ecif ic and o e l co nj unt o de va lo r es q u e un a v ar iab le d e
                                      un o d e es os t i pos p u e de t om ar y el c on ju nto de o p e rac io n es r ea li z abl es s ob re
                                      los m ism os.

                                      P or e je mp l o, si s e dec l ar a e n C/ C++

                                                                    unsigned int x, y;




                         6      Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

        La i nstr ucc ió n n = 9+10 de un p r og ram a d ond e = es el o pe ra do r d e asig nac ió n ,
        el co nte ni do de la l oca l idad de al mac en ami e nt o da do p o r n ser á e l va l or 19.

Cad a tip o d e datos : es rec on oc ido p or l os e l e ment os de d atos qu e p ued e tom a r y po r
las o pe ra ci on es asoc ia das a é l. (su dom in io ) E jem p lo : en p asca l

                  Dom ini o ent e r o D= {0, 1, 2….ma x }

                  O pe r aci on es




Los T D As so n ge n er al i zac io nes de los ti p os de dat os bás ic os y d e las o p e rac io nes
p rim iti vas . U n TD A en caps ul a ti p os d e dat o s en el s e ntid o qu e e s pos ibl e p on e r l a
def in ici ón de l ti p o y todas las o pe ra ci on es con es e ti p o e n u n a secc ió n d e u n
p ro gr ama .

P or ej em pl o, s e p ue de def in ir un ti p o de d ato s abstra cto C O NJ UNT O [ Ah o198 8] c on e l
cua l se p u ed en d ef in i r l as sig ui ent es o pe r aci o nes:

        AN UL A ( A )

                           Hac e v ací o a l c on ju nto A

        UNI ON ( A, B, C )

                           Co nstr u y e el c o nju nt o C a p art i r d e la un ió n de los co nj unt os A y
                           B.

        T A M AÑ O( A )

                           Ent r eg a l a ca nti dad de el em ent os d e l co nj unt o A.

El co mp o ne nt e bás ico de una est r uctu ra de d atos es la c el da.

        La c eld a a lma ce na un v al or tom ad o d e a lgú n t i po d e dat o s im pl e o c o mpu est o

        El m eca nism o de ag r e gaci ón d e c el das ll am ado a r re gl o es una c o lec ci ón de
        el em ent os d e t ip o hom og én eo .

A r re gl o b idim e nsi on al en C/ C++

        int w[5][3]

                                                                                w[ i ] [j ] = b [ i * n + j]

                                                                                n es la c ant ida d d e
                                                                                col umn as d el a r re gl o
                                                                                                                ESTRUCTURADE DATOS I -- FCI




                                                                                w[ 2] [0 ] = b [6 ]




    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                            7
Universidad Tecnica de Manabí                            Facultad de Ciencias Informaticas


                               Estructuras de datos
                               So n datos elementales aquellos que se consideran indivisibles en unidades más
                               simples.

                               Un a est ru ctu ra d e dat os es u na c las e de d atos qu e s e pu ed e ca ract e ri za r po r s u
                               or ga ni zac ió n y o pe r aci on es d ef in idas s ob r e e lla . Al gun as v eces a es tas est ru ctu ras s e
                               les ll ama ti pos d e dat o s.

                               Los ti pos d e d atos         más    fr ec u ent es   uti li z ados   en   los   d if er e nt es   l eng ua jes   de
                               p ro gr amac i ón s on :

                               Lógicas de datos.- En un p r og ram a, c ada v a r iabl e p e rt en ec e a al gu na es t ruct u ra d e
                               datos e xp líc ita o im p líc itam ent e d ef in ida, la c ual det e rmi na el c o nju nto d e op e rac i on e s
                               va lid as pa ra e ll a.

                               Primitivas y simples.- A qu e ll as q ue no está n com p uest as p o r ot r as est ruct u ras d e
                               datos p o r ej em pl o, ent e ros, bo ol ea n os y ca r ac ter es.

                               Lineales: pilas , c olas y listas li gad as l in ea l es.

                               No lineales incluyen grafos y á rb ol es.

                               Organización de archivos.- Las técnic as de estr uctu ra ci ón d e datos a pl ica das a
                               con ju ntos de dat os qu e los s iste mas o p e rati v os ma n eja n c o mo ca jas ne g ras
                               comú nm ent e s e lla ma n O rg a ni za c i ón de A rc h iv o s.

                               CLASIFICACIÓN DE LAS ESTRUCTURAS DE DATOS
                               Se clasifican en:
                                   a) Por su almacenamiento
                                   b) Por su organización
                                   c) Por su comportamiento

                               a) Por su almacenamiento.- Se clasifican en:
                                        Internas
                                        Externas

                               Internas.- Son aquellas cuyas estructuras se almacena en la memoria principal.
                               Externas.- Son aquellas que se almacenan en las memorias secundarias de un sistema de computadoras.

                               b) Por su organización.- Se clasifican en:
                                        Estáticas
                                        Dinámicas

                               Estáticas.- son aquellas cuya agrupación de memoria no se disminuye o aumenta estas son: cadenas,
                               conjuntos, escalares, entre otros.
                               Dinámicas.- Son aquellas cuya agrupación de memoria pueden aumentar o disminuir durante la ejecución
                               del programa, estas son: pila, colas, listas.
ESTRUCTURA DE DATOS I -- FCI




                               d) Por su comportamiento.- Se clasifican en:
                                        Simples
                                        Compuesto o Estructurados

                               Simples.-Son aquellas que almacenan un valor y son:

                                                Enteros
                                Escalares       Real
                                                Lógicos
                                                Caracteres



                         8      Manual de Estructura de Datos
Universidad Tecnica de Manabí                                            Facultad de Ciencias Informaticas


Compuesto.- Son aquellos que almacenan múltiples valores en su estructura y son los siguientes:

        Cadenas
        Arreglos
        Conjuntos
        Registros
        Listas
        Pilas
        Colas
        Árboles
        Archivos
        Base de datos


                                                                       Enteros
                                                                       Reales
           Clasificación de las estructuras de Datos




                                                       Simples         Caracteres
                                                                       Cadena
                                                                       Booleano


                                                                                    Arreglo
                                                                       Estático     Conjunto
                                                                                            Registro


                                                                                                  Listas
                                                       Estructurados                Lineales      Pilas
                                                                                                  Colas
                                                                       Dinámicos

                                                                                    No Lineales Árboles
                                                                                                Grafos




Los ti pos d e dat os sim pl es pu ed en s er o rga ni zad os e n di fe r ent es est ruct u ras d e dat os :
estát icas y di nám icas.
                                                                                                                         ESTRUCTURADE DATOS I -- FCI




Las estructuras de datos estáticas:
So n a q ue ll as en las q ue el t ama ño oc u pad o en m em o ri a se d e fin e a ntes de q ue e l
p ro gr ama se ej ecut e y n o pu ed e m od if ica rs e dic ho tam añ o d u rant e la e j ecuc ió n de l
p ro gr ama .

Est as est r uctu ras est á n im p le me ntad as en c a si tod o s los l en gua j es.

Su pr inc i pa l c a ract e rís tica es qu e ocu p an so lo u na casi ll a de m em or ia, po r l o t ant o
una v a ria bl e sim p l e h ace r ef e re nc ia a u n ú n ico v al o r a la v ez , d en tro de est e g r up o



    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                                     9
Universidad Tecnica de Manabí                        Facultad de Ciencias Informaticas

                               de d atos s e en cu ent ra : ent e ros , re al es, c a ract e res, bo lé an os, en um e r ados y s ub ra ng os
                               (l os últi mos n o e x iste n en al gu nos l eng ua jes d e p rog r amac ió n )

                               Las estructuras de datos dinámicas:
                               No ti en e n las lim itac io nes o r est ri cci on es en el ta ma ño d e m em or ia ocu p ada qu e s o n
                               p ro p ias d e las est ruct u ras estát icas .

                               M edi ant e el us o de u n ti p o d e dat os es pe cifi co, d en omi na do p u nte r o, es p osib l e
                               const r ui r est ru ctu ras d e dat os di nám icas qu e no s on so p o rtad as p o r la ma y o ría d e l os
                               le ngu aj es, p er o qu e en aq u el los q ue s i ti en en estas c ar act er ístic as o f r ece n so lu ci on es
                               efi cac es y ef ect iv as en la s ol uci ón d e pr ob lem as co mp l ej os.

                               Se c a ract e ri za po r el h ech o d e q ue c o n un n omb re s e ha ce r ef er e n cia a u n g ru p o de
                               casi llas d e m emo r ia. E s dec i r u n dat o est ruct ur ad o ti en e va r ios com po n ent es.




                               VARIABLES ESTRUCTURADAS O ARREGLOS
                               CONJUNTO DE DATOS DEL MISMO DEL MISMO TIPO AGRUPADOS BAJO UN
                               SOLO NOMBRE
                               Pa r a r ef e ri r nos a un o de el los s e ha ce r ef er enc ia a la p osic ió n qu e oc u pa el d at o
                               r esp ect o a los ot ros. Pu ed en s e r u ni dems io na les ( v ecto r es ) mu ltid ime nsi o nal es (
                               matr ic es )

                               Ej :

                               vo ca l= {a, e,i ,o, u }

                               La l ista d e c las e c o n n otas

                               VECTORES
                               A r re gl os u ni dim ens in al es:

                               Ej em p lo:

                                      •   Lista d e Cl ase

                                      •   Co la p ar a c om p ra r ti ck est

                                      •   Voca les d el abe ce da ri o .



                               OPERACIONES CON VECTORES
                               P ode mos hac e r c on un v ecto r:
ESTRUCTURA DE DATOS I -- FCI




                                      •   Lle na r

                                      •   Most r ar

                                      •   O rd en ar

                                      •   Busc a r:

                                      •   Se cu enc ia l

                                      •   Bi na ri a


      10                         Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

Estructuras

Supongamos que queremos hacer una agenda con los números de teléfono de nuestros amigos.
Necesitaríamos un array de Cadenas para almacenar sus nombres, otro para sus apellidos y otro para sus
números de teléfono. Esto puede hacer que el programa quede desordenado y difícil de seguir. Y aquí es
donde vienen en nuestro auxilio las estructuras.

Para definir una estructura usamos el siguiente formato:

struct nombre_de_la_estructura {
    campos de estructura;
    };

NOTA: Es importante no olvidar el ';' del final, si no a veces se obtienen errores extraños.

Para nuestro ejemplo podemos crear una estructura en la que almacenaremos los datos de cada persona.
Vamos a crear una declaración de estructura llamada amigo:

struct estructura_amigo {
    char nombre[30];
    char apellido[40];
    char telefono[10];
    char edad;
    };
A cada elemento de esta estructura (nombre, apellido, teléfono) se le llama campo o miembro. (NOTA: He
declarado edad como char porque no conozco a nadie con más de 127 años.

Ahora ya tenemos definida la estructura, pero aun no podemos usarla. Necesitamos declarar una variable
con esa estructura.

struct estructura_amigo amigo;

Ahora la variable amigo es de tipo estructura_amigo. Para acceder al nombre de amigo usamos:
amigo.nombre. Vamos a ver un ejemplo de aplicación de esta estructura. (NOTA: En el siguiente ejemplo
los datos no se guardan en disco así que cuanda acaba la ejecución del programa se pierden).

#include <stdio.h>
struct estructura_amigo {/* Definimos la estructura estructura_amigo */
    char nombre[30];
    char apellido[40];
    char telefono[10];
    char edad;
    };

struct estructura_amigo amigo;
void main()
   {
                                                                                                         ESTRUCTURADE DATOS I -- FCI




   printf( "Escribe el nombre del amigo: " );
   fflush( stdout );
   scanf( "%s", &amigo.nombre );
   printf( "Escribe el apellido del amigo: " );
   fflush( stdout );
   scanf( "%s", &amigo.apellido );
   printf( "Escribe el número de teléfono del amigo: " );
   fflush( stdout );
   scanf( "%s", &amigo.telefono );
   printf( "El amigo %s %s tiene el número: %s.n", amigo.nombre,
        amigo.apellido, amigo.telefono );
   }

    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                     11
Universidad Tecnica de Manabí                       Facultad de Ciencias Informaticas

                               Este ejemplo estaría mejor usando gets que scanf, ya que puede haber nombres compuestos que scanf no
                               cogería por los espacios.




                               Se podría haber declarado directamente la variable amigo:

                               struct estructura_amigo {
                                   char nombre[30];
                                   char apellido[40];
                                   char telefono[10];
                                   } amigo;


                               Arrays de estructuras

                               Supongamos ahora que queremos guardar la información de varios amigos. Con una variable de estructura
                               sólo podemos guardar los datos de uno. Para manejar los datos de más gente (al conjunto de todos los
                               datos de cada persona se les llama REGISTRO) necesitamos declarar arrays de estructuras.

                               ¿Cómo se hace esto? Siguiendo nuestro ejemplo vamos a crear un array de ELEMENTOS elementos:

                               struct estructura_amigo amigo[ELEMENTOS];

                               Ahora necesitamos saber cómo acceder a cada elemento del array. La variable definida es amigo, por lo
                               tanto para acceder al primer elemento usaremos amigo[0] y a su miembro nombre: amigo[0].nombre.
                               Veamoslo en un ejemplo en el que se supone que tenemos que meter los datos de tres amigos:

                               #include <stdio.h>
                               #define ELEMENTOS        3
                               struct estructura_amigo {
                                   char nombre[30];
                                   char apellido[40];
                                   char telefono[10];
                                   int edad;
                                   };
                               struct estructura_amigo amigo[ELEMENTOS];

                               void main()
                                  {
                                  int num_amigo;
                                  for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ )
                                      {
                                      printf( "nDatos del amigo número %i:n", num_amigo+1 );
                                      printf( "Nombre: " ); fflush( stdout );
                                      gets(amigo[num_amigo].nombre);
                                      printf( "Apellido: " ); fflush( stdout );
ESTRUCTURA DE DATOS I -- FCI




                                      gets(amigo[num_amigo].apellido);
                                      printf( "Teléfono: " ); fflush( stdout );
                                      gets(amigo[num_amigo].telefono);
                                      printf( "Edad: " ); fflush( stdout );
                                      scanf( "%i", &amigo[num_amigo].edad );
                                      while(getchar()!='n');
                                      }
                                  /* Ahora imprimimos sus datos */
                                  for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ )
                                      {
                                      printf( "El amigo %s ", amigo[num_amigo].nombre );
                                      printf( "%s tiene ", amigo[num_amigo].apellido );

      12                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

      printf( "%i años ", amigo[num_amigo].edad );
      printf( "y su teléfono es el %s.n" , amigo[num_amigo].telefono );
      }
   }
IMPORTANTE: Quizás alguien se pregunte qué pinta la línea esa de while(getchar()!='n');. Esta línea se usa
para vaciar el buffer de entrada. Para más información consulta Qué son los buffer y cómo funcionan.




Inicializar una estructura

A las estructuras se les pueden dar valores iniciales de manera análoga a como hacíamos con los arrays.
Primero tenemos que definir la estructura y luego cuando declaramos una variable como estructura le
damos el valor inicial que queramos. Recordemos que esto no es en absoluto necesario. Para la estructura
que hemos definido antes sería por ejemplo:

struct estructura_amigo amigo = {
    "Juanjo",
    "Lopez",
    "592-0483",
    30
    };

NOTA: En algunos compiladores es posible que se exiga poner antes de struct la palabra static.

Por supuesto hemos de meter en cada campo el tipo de datos correcto. La definición de la estructura es:

struct estructura_amigo {
     char nombre[30];
     char apellido[40];
     char telefono[10];
     int edad;
     };
por lo tanto el nombre ("Juanjo") debe ser una cadena de no más de 29 letras (recordemos que hay que
reservar un espacio para el símbolo '0'), el apellido ("Lopez") una cadena de menos de 39, el teléfono una
de 9 y la edad debe ser de tipo char.




Vamos a ver la inicialización de estructuras en acción:

#include <stdio.h>
struct estructura_amigo {
      char nombre[30];
      char apellido[40];
      char telefono[10];
      int edad;
                                                                                                              ESTRUCTURADE DATOS I -- FCI




      };
struct estructura_amigo amigo = {
     "Juanjo",
     "Lopez",
     "592-0483",
     30
     };
int main()
    {
    printf( "%s tiene ", amigo.apellido );
    printf( "%i años ", amigo.edad );
    printf( "y su teléfono es el %s.n" , amigo.telefono );

    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                          13
Universidad Tecnica de Manabí                         Facultad de Ciencias Informaticas

                                  }

                               También se puede inicializar un array de estructuras de la forma siguiente:

                               struct estructura_amigo amigo[] =
                                   {
                                   "Juanjo", "Lopez", "504-4342", 30,
                                   "Marcos", "Gamindez", "405-4823", 42,
                                   "Ana", "Martinez", "533-5694", 20
                                   };


                               En este ejemplo cada línea es un registro. Como sucedía en los arrays si damos valores iniciales al array de
                               estructuras no hace falta indicar cuántos elementos va a tener. En este caso la matriz tiene 3 elementos,
                               que son los que le hemos pasado.

                               Paso de estructuras a funciones

                               Las estructuras se pueden pasar directamente a una función igual que hacíamos con las variables. Por
                               supuesto en la definición de la función debemos indicar el tipo de argumento que usamos:




                               int nombre_función ( struct nombre_de_la_estructura nombre_de_la variable_estructura )




                               En el ejemplo siguiente se usa una función llamada suma que calcula cual será la edad 20 años más tarde
                               (simplemente suma 20 a la edad). Esta función toma como argumento la variable estructura arg_amigo.
                               Cuando se ejecuta el programa llamamos a suma desde main y en esta variable se copia el contenido de la
                               variable amigo.




                               Esta función devuelve un valor entero (porque está declarada como int) y el valor que devuelve (mediante
                               return) es la suma.

                               #include <stdio.h>

                               struct estructura_amigo {
                                    char nombre[30];
                                    char apellido[40];
                                    char telefono[10];
                                    int edad;
                                    };
ESTRUCTURA DE DATOS I -- FCI




                               struct estructura_amigo amigo = {
                                   "Juanjo",
                                   "Lopez",
                                   "592-0483",
                                   30
                                   };

                               int suma( struct estructura_amigo arg_amigo )
                                  {
                                  return arg_amigo.edad+20;
                                  }
                               int main()

      14                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

   {
   printf( "%s tiene ", amigo.apellido );
   printf( "%i años ", amigo.edad );
   printf( "y dentro de 20 años tendrá %i.n", suma(amigo) );
   }


Si dentro de la función suma hubiésemos cambiado algún valor de la estructura, dado que es una copia no
hubiera afectado a la variable amigo de main. Es decir, si dentro de 'suma' hacemos arg_amigo.edad = 20;
el valor de arg_amigo cambiará, pero el de amigo seguirá siendo 30.

También se pueden pasar estructuras mediante punteros o se puede pasar simplemente un miembro (o
campo) de la estructura.

Si usamos punteros para pasar estructuras como argumentos habrá que hacer unos cambios al código
anterior (en negrita y subrrayado):

int suma( struct estructura_amigo *arg_amigo )
   {
   return arg_amigo->edad+20;
   }
int main()
     {
     printf( "%s tiene ", amigo.apellido );
     printf( "%i años ", amigo.edad );
     printf( "y dentro de 20 años tendrá %i.n", suma(&amigo) );
     }
Lo primero será indicar a la función suma que lo que va a recibir es un puntero, para eso ponemos el *
(asterisco). Segundo, como dentro de la función suma usamos un puntero a estructura y no una variable
estructura debemos cambiar el '.' (punto) por el '->'. Tercero, dentro de main cuando llamamos a suma
debemos pasar la dirección de amigo, no su valor, por lo tanto debemos poner '&' delante de amigo.

Si usamos punteros a estructuras corremos el riesgo (o tenemos la ventaja, según cómo se mire) de poder
cambiar los datos de la estructura de la variable amigo de main.




Pasar sólo miembros de la estructura

Otra posibilidad es no pasar toda la estructura a la función sino tan sólo los miembros que sean
necesarios. Los ejemplos anteriores serían más correctos usando esta tercera opción, ya que sólo usamos
el miembro 'edad':

int suma( char edad )
   {
   return edad+20;
   }
                                                                                                           ESTRUCTURADE DATOS I -- FCI




int main()
     {
     printf( "%s tiene ", amigo.apellido );
     printf( "%i años ", amigo.edad );
     printf( "y dentro de 20 años tendrá %i.n", suma(amigo.edad) );
     }
Por supuesto a la función suma hay que indicarle que va a recibir una variable tipo char (amigo->edad es
de tipo char).




    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                       15
Universidad Tecnica de Manabí                          Facultad de Ciencias Informaticas


                               Estructuras dentro de estructuras (Anidadas)

                               Es posible crear estructuras que tengan como miembros otras estructuras. Esto tiene diversas utilidades,
                               por ejemplo tener la estructura de datos más ordenada. Imaginemos la siguiente situación: una tienda de
                               música quiere hacer un programa para el inventario de los discos, cintas y cd's que tienen. Para cada título
                               quiere conocer las existencias en cada soporte (cinta, disco, cd), y los datos del proveedor (el que le vende
                               ese disco). Podría pensar en una estructura así:


                               struct inventario {
                                    char titulo[30];
                                    char autor[40];
                                    int existencias_discos;
                                    int existencias_cintas;
                                    int existencias_cd;
                                    char nombre_proveedor[40];
                                    char telefono_proveedor[10];
                                    char direccion_proveedor[100];
                                    };


                               Sin embargo utilizando estructuras anidadas se podría hacer de esta otra forma más ordenada:

                               struct estruc_existencias {
                                   int discos;
                                   int cintas;
                                   int cd;
                                   };
                               struct estruc_proveedor {
                                    char nombre[40];
                                    char telefono[10];
                                    char direccion[100];
                                   };

                               struct estruc_inventario {
                                    char titulo[30];
                                    char autor[40];
                                    struct estruc_existencias existencias;
                                    struct estruc_proveedor proveedor;
                                    } inventario;


                               Ahora para acceder al número de cd de cierto título usaríamos lo siguiente:

                                       inventario.existencias.cd

                               y para acceder al nombre del proveedor:
ESTRUCTURA DE DATOS I -- FCI




                                       inventario.proveedor.nombre




      16                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

Tipos de datos definidos por el usuario
Typedef

Ya conocemos los tipos de datos que nos ofrece C: char, int, float, double con sus variantes unsigned,
arrays y punteros. Además tenemos las estructuras. Pero existe una forma de dar nombre a los tipos ya
establecidos y a sus posibles variaciones: usando typedef. Con typedef podemos crear nombres para los
tipos de datos ya existentes, ya sea por capricho o para mejorar la legibilidad o la portabilidad del
programa.




Por ejemplo, hay muchos programas que definen muchas variables del tipo unsigned char. Imaginemos un
hipotético programa que dibuja una gráfica:

unsigned char x0, y0;           /* Coordenadas del punto origen */

unsigned char x1, y1;           /* Coordenadas del punto final */

unsigned char x, y;             /* Coordenadas de un punto genérico */

int F;                /* valor de la función en el punto (x,y) */

int i;                /* Esta la usamos como contador para los bucles */

La definición del tipo unsigned char aparte de ser larga no nos da información de para qué se usa la
variable, sólo del tipo de dato que es.

Para definir nuestros propios tipos de datos debemos usar typedef de la siguiente forma:

typedef tipo_de_variable nombre_nuevo;

En nuestro ejemplo podríamos hacer:

typedef unsigned char COORD;

typedef int CONTADOR;

typedef int VALOR;




y ahora quedaría:

COORD x0, y0; /* punto origen */
                                                                                                              ESTRUCTURADE DATOS I -- FCI




COORD x1, y1; /* punto final */

COORD x, y;           /* punto genérico */

VALOR F;              /* valor de la función en el punto (x,y) */

CONTADOR i;




         Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                     17
Universidad Tecnica de Manabí                     Facultad de Ciencias Informaticas

                               Ahora, nuestros nuevos tipos de datos, aparte de definir el tipo de variable nos dan información adicional
                               de las variables. Sabemos que x0, y0, x1, y1, x, y son coordenadas y que i es un contador sin necesidad de
                               indicarlo con un comentario.




                               Realmente no estamos creando nuevos tipos de datos, lo que estamos haciendo es darles un nombre más
                               cómodo para trabajar y con sentido para nosotros.




                               Punteros

                               También podemos definir tipos de punteros:

                               int *p, *q;

                               Podemos convertirlo en:

                               typedef int *ENTERO;

                               ENTERO p, q;

                               Aquí p, q son punteros aunque no lleven el operador '*', puesto que ya lo lleva ENTERO incorporado.

                               Arrays

                               También podemos declarar tipos array. Esto puede resultar más cómodo para la gente que viene de BASIC
                               o PASCAL, que estaban acostumbrados al tipo string en vez de char:

                               typedef char STRING[255];

                               STRING nombre;

                               donde nombre es realmente char nombre[255];.

                               Estructuras

                               También podemos definir tipos de estructuras. Antes, sin typedef:

                               struct _complejo {
                                        double real;
                                        double imaginario;
                                        };
ESTRUCTURA DE DATOS I -- FCI




                               struct _complejo numero;
                               Con typedef:
                               typedef struct {
                                        double real;
                                        double imaginario;
                                        } COMPLEJO;
                               COMPLEJO numero;




      18                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                            Facultad de Ciencias Informaticas

Asignación de Memoria Dinámica

Métodos de Asignación de Memoria

¿Cuáles son los métodos de asignación de memoria utilizados por el S.O.?

Cabe destacar que el almacenamiento y procesamiento de todos los datos es realizado en memoria RAM,
en un segmento destinado a ello (DS), por ello, es importante conocer los métodos de asignación de
memoria utilizados para su almacenamiento. Por un lado, se tiene la asignación estática de memoria en
donde se reserva la cantidad necesaria para almacenar los datos de cada estructura en tiempo de
compilación. Esto ocurre cuando el compilador convierte el código fuente (escrito en algún lenguaje de alto
nivel) a código objeto y solicita al S.O. la cantidad de memoria necesaria para manejar las estructuras que
el programador utilizó, quien según ciertos algoritmos de asignación de memoria, busca un bloque que
satisfaga los requerimientos de su cliente. Por otro lado se tiene la asignación dinámica en donde la
reserva de memoria se produce durante la ejecución del programa (tiempo de ejecución). Para ello, el
lenguaje Pascal cuenta con dos procedimientos: NEW() y DISPOSE() quienes realizan llamadas al S.O.
solicitándole un servicio en tiempos de ejecución. El procedimiento NEW ,por su parte, solicita reserva de
un espacio de memoria y DISPOSE la liberación de la memoria reservada a través de una variable especial
que direccionará el bloque asignado o liberado según sea el caso.




Ejemplo : Cuando se compilan las sgtes. Líneas de código se produce una asignación estática de memoria:

var linea: string [80];

(*Se solicita memoria para 80 caracteres --> 80 bytes)

operatoria: Array[1..100,1..100] of real;

(*Se solicita memoria para 100x100 reales -> 100 x 100 x 4 bytes)

interes : integer;
                                                                                                              ESTRUCTURADE DATOS I -- FCI




(*Se solicita memoria para 1 entero --> 2 bytes)

¿Cuántos bytes se reservarían para:?

datos: array [1..25] of double;

Para explicar con mayor detalle el concepto de memoria dinámica es necesario conocer el concepto ¡PUNTEROS!




     Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                         19
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas




                               Punteros

                               Son tipos de datos simples capaces de almacenar la posición de una variable en memoria principal. Se dice que ellos
                               direccionan a otras variables.

                               Ejemplo:




                                                                           Se dice que las variables ubicadas en las posiciones 1003 y 1006 son
                                                                           punteros, pues direccionan o "apuntan a" las posiciones 1000 y 1007
                                                                           respectivamente.




                               Otra explicación.-
                               Un pu nte r o es u n obj et o q ue a p unta a otr o ob jet o. Es d eci r, u na va ri abl e cu yo va lo r es
                               la d i rec ci ón de mem o ri a d e ot ra va ri abl e.

                               No h a y qu e c o nfu ndi r una di r ecc ió n d e m em or ia co n el co nte ni do d e esa d i re cci ón d e
                               mem or ia .

                                   i nt x = 2 5;

                                    D i rec ci ón         15 02       1504        1 506       1508




                               La di r ecc ió n d e la va r ia ble x ( & x) es 1502

                               El co nt en ido d e l a va ri a ble x es 2 5

                               Las di rec ci on es de m e mo ria d e p end en d e l a ar q uit ectu r a de l o rd en ado r y de l a gest ió n
                               qu e e l sist ema o p e rati v o h aga de e ll a.
ESTRUCTURA DE DATOS I -- FCI




                               En l en gua j e e nsam bla d or se deb e ind ica r num é ric ame nt e l a pos ici ón físic a d e m em or i a
                               en qu e qu e re mos a lma cen a r un d ato. D e a hí qu e est e l en gu aj e de p end a tant o d e l a
                               má qui na e n l a qu e s e a pl i qu e.

                               En C n o d eb em os, n i p od emos , i nd ica r num é r icam ent e la di r ecc ió n de m em o ri a, s i n o
                               qu e ut il iz amos una eti qu et a q ue c on oc em os com o va r iab le ( en su día d efi ni mos l as
                               va r iab les com o di r ecci on es d e m em o ri a) . L o qu e n os i nte r esa es al mace na r un dat o, y
                               no la l oca li zac ió n ex act a d e es e d ato e n m em o ri a.




      20                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                                  Facultad de Ciencias Informaticas

Un a v ar iab l e p unt e ro s e dec la r a com o tod as l as va r iab les. D eb e se r del m ismo t ip o qu e
la va r iab le a pu ntad a. S u id e ntif ica do r va p r ec edi do de un ast e risc o ( *):

                      i nt * p u nt;

Es un a v ar iab l e pu nt er o q ue a pu nta a va ri ab le qu e c o nti en e un d a to d e ti po ent e ro
lla mad a pu nt.

                      ch a r *c ar:

Es un p unt e ro a va ri abl e d e ti p o c ar áct er .

                      l o ng f lo at *n um;

                      f lo at * mat[ 5] ;    // . . .

Es d eci r: ha y ta ntos tip os d e p unt e ros c omo t ip os d e dat os, aun q u e tambi é n
pu ed en       de cla r ars e   pu nt er os      a estruct ur as más c om p le jas ( func i on es, st r uct ,
fich e ros ... ) e i ncl uso p u nte r os vac íos ( v oid ) y pu nt er os nu los (N ULL ).

Dec la rac ió n d e v ar iab le s pu nt er o: S ea un f rag ment o d e p r og ram a e n C:

cha r dat o;        // v a riab l e q ue al mac en a rá un c a r ácte r.

cha r * p unt;       //d ec la r aci ón de p unt e ro a c ar ácte r.

pu nt = & dat o; // e n l a va r iab le p unt gu ar dam o s la d i re cci ón
                  // d e m em o ria d e l a va r iab le dat o; pu nt a p u nta
        // a d ato . Ambas so n del mism o t ip o, ch ar.

int * p unt = N ULL, va r = 14;

pu nt = & va r;

p ri ntf (“ %# X,    %# X ”, pu nt, & va r ) // la m ism a s ali da: di r ecci ón

p ri ntf (“ n% d, %d ”, * pu nt, va r );      //sa lid a: 1 4, 14

 H a y qu e t en e r c uid ad o c on las di r ecci on es a pu ntad as:

p ri ntf (“ %d, %d ”, * ( pu n t+1), v a r+1 );

*( pu nt + 1 ) r e pes e nta el v al o r co nt en ida e n la d i rec ci ón de m em o ri a a um enta da en
una p osi ci ón ( int=2 by tes) , qu e s e rá un v al or n o d ese ad o. Si n emb ar go v ar +1
r ep r es enta e l va lo r 15.

pu nt + 1 r e p r ese nta l o m ism o qu e &v a r + 1 ( a van ce en la d ir ecc i ón d e m em o ria d e
va r ).

Al tr aba ja r c on p unt e r o s se em pl ea n d os o pe r ado r es esp ec íf icos :
                                                                                                                      ESTRUCTURADE DATOS I -- FCI




          O pe r ado r d e d i r ecci ón :     & R e p r ese nta la di r ecc ió n de m em o ri a de la va r iab le
qu e l e sig u e:

         &fn um r e p res en ta la di r ecc ió n d e f num .

           O p er ad o r d e c o nte nid o o i nd ir ecc i ón: *

El o p er ad o r     *    a pl ic ado   al nomb r e d e u n pu nt er o i nd ica      el   va l or de la va r iab le
ap unt ada:

flo at alt ur a = 2 6.92, *ap unt a;



     Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                                 21
Universidad Tecnica de Manabí                          Facultad de Ciencias Informaticas

                               ap unt a = &a ltu r a; // in i cia li zac ió n d el p unt e ro

                               flo at alt ur a = 2 6.92, * ap unt a;

                               ap unt a = &a ltu r a; // in i cia li zac ió n d el p unt e ro

                               .p ri ntf ( “n %f ”, a ltu r a) ;    //sa li da 2 6.92

                               .p ri ntf ( “n %f ”, * a punt a );

                               No s e d eb e co nf und i r e l o p e rad o r * en l a d ecl ar aci ón de l pu nt er o:

                                                   int * p;

                               Co n el o pe r ad or * en la s inst ru cci on es:

                                                 * p = 27;

                                                   p ri ntf ( “ n Co nte ni do = %d ”, *p );

                               Veam os c on u n e j em pl o en C la dif e r enc ia e ntr e to dos est os c onc e pt o s

                               Veam os el a rch i vo

                                     - p unt0 .c pp

                                     - p unt1 .c pp

                               Es d ec i r:     int x = 25, *p int;

                                                 pi nt = & x;

                               La va ri abl e p int c onti e ne l a d ir ecc ió n de m em or ia d e la v ar iab l e x. L a ex p r esi ón: * pi nt
                               r ep r es enta el va lo r de la v a riab l e ( x) a p unt ad a, es dec i r 25. La v a ri abl e p int tamb ié n
                               tie ne su p ro p ia di r ecci ó n: & pi nt

                               Veam os c on ot r o ej em p lo e n C la di fe r enc ia e n tre tod os est os c onc e pt os

                               vo id mai n ( vo id ) {

                               int a, b, c , * p1, *p 2;

                               vo id *p ;

                               p1 = & a;               // P aso 1. La di r ecci ó n d e a es asig nad a a p 1

                               *p1 = 1;                // P as o 2. p1 (a ) es i gu al a 1. E qu i va le a a = 1;

                               p2 = & b;             / / Pas o 3. La d i re cci ón de b es asig nad a a p2

                               *p2 = 2;               // P aso 4. p 2 (b) es ig ua l a 2. E qu i va le a b = 2;
ESTRUCTURA DE DATOS I -- FCI




                               p1 = p 2;              // Pas o 5. El va l or de l p1 = p2

                               *p1 = 0;               // P aso 6. b = 0

                               p2 = & c;            / / Pas o 7 . La d i rec ci ón de c es a sign ada a p2

                               *p2 = 3;             // Pas o 8 . c = 3

                               p ri ntf (" %d % d %d n ", a, b, c );           / / Pas o 9. ¿Q u é se im p rim e ?

                               p = p1 ;             / / Pas o 1 0. p co nti e ne la di r ecci ón de p1

                               p = p2 ;              // Pas o 11. p1= p2;

      22                         Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

*p1 = 1;                / / Pas o 12. c = 1

p ri ntf (" %d % d %d n ", a, b, c );             // Pas o 13 . ¿ Qu é s e i mp r im e?

   }

Vamos a h ac er un se g uim ie nto de las di r ecc i on es d e m em o ria y de los v al or es d e las
va r iab les e n cad a pas o. Su p on em os qu e l a va r iab le a es co lo cad a e n l a di r ecc ió n
0000, b e n l a sig ui e n te, es d eci r 0 002, co n u n o ffs et d e 2 b yt e s, p o r se r v al o res
int eg er .

Se t rat a d e un sist em a de pos ici o nes re lat i va s de mem o ri a. S e v e rá e n ar itm étic a d e
pu nt er os.

Se obti en e e l s igu i ent e cu ad ro. En él r ef l eja m os las di r ecci o nes re lat iv as d e me mo r ia y
los c amb ios e n ca da un o d e l os pas os m a rcad o s:




Inic ia li zac ió n d e pu nt er os( I) :




Si < Alm ac en ami ent o> es e xte r n o stat ic, <E x p res io n> deb e rá s e r u na e x p res ió n
                                                                                                                     ESTRUCTURADE DATOS I -- FCI




const ant e d el ti p o < Ti p o> ex p r esad o.

Si < Al mac en ami e nto> es aut o, ent on ces < E x p res io n> p u ed e s er cu al qu i er e x p res i ón
del < Ti p o> esp ec if icad o.

Ej em p los:

       1) La co nstant e ent e ra 0, NULL (c er o ) p r o po rc io n a un pu nte r o nu l o a cu al qu i er ti p o
          de d ato:

                              int *p;



       Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                              23
Universidad Tecnica de Manabí                              Facultad de Ciencias Informaticas

                                                            p = NUL L; // actu al iz aci ó n

                               2) El no mb re d e un a r ra y d e a lma ce nam i ent o stati c o ext e rn s e t r ansf o rma s eg ún la
                               ex p r esi ón:

                                                         a ) f l oat m at [12 ];

                               fl oat * p unt = mat;

                                                         b) fl o at mat [12 ];

                                    f lo at * p unt = & mat [0 ];

                               3) U n “ cast ” pu nt er o a pu nt er o:

                                                       int *p unt = ( int *) 123. 456;

                               Inic ia li za e l pu nte r o c o n e l ent e ro .

                               4) U n punt e r o a ca ráct e r pu ed e i nic ia li za rs e e n l a f or ma:

                               cha r *c ad en a = Est o e s un a cad e na ”;

                               5) S e p u ede n suma r o r esta r v al o res e nt er os a las dir ecc io n es de m e mo ria en l a fo rma :
                               (a rit mét ica de p unt e r os)

                                                       st atic int x;

                                 int * pu nt = & x+2, *p = & x-1;

                               6) E qu i va le nci a: D os ti pos de fi nid os c omo p u nte r os a o bj eto P y pu n ter o a obj et o Q so n
                               e qu iv al e ntes s ó lo s i P y Q s on de l m ism o ti p o. A pl ica do a m atr ic es:

                                          nomb r e_ pu nte r o = nom br e_m atr i z;
ESTRUCTURA DE DATOS I -- FCI




      24                         Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

PUNTEROS Y ARRAYS
Se a el a rr a y d e una di mens ió n:

   i nt mat [ ] = { 2, 16 , - 4, 29, 234, 1 2, 0, 3 };

en e l qu e c ada e le me nt o, po r s e r t ip o int, oc u p a dos b ytes de me mo ri a.

Su p on em os qu e la di re cció n d e m em o ri a d el p rim e r el em ent o, es 1 50 0:

               & mat [0 ] es 1 500

               & mat [1 ] s er á 1502

               & mat [7 ] s er á 1514

  int mat [ ] = {2 , 16, -4 , 29, 2 34, 12 , 0, 3} ;

En tot al los 8 el em ent o s ocu p an 16 b yt es.

P ode mos r e p res ent a r l as di r ecci o nes de mem or ia q u e oc u pa n l os el e ment os d e l a r ra y ,
los dat os qu e c ont ie n e y las p osic io n es d el a rr ay e n l a f o rma:

Di rec ci ón       1 500      1 502      1 504    1506      1 508     1510      151 2     1514




El em e nto
         mat [0 ] mat [1 ] mat [2 ] mat [3 ] mat [4 ] mat [5 ] mat [6 ] m at[ 7]

El acc es o po dem os hac e rl o m edi ant e el ín dic e:

             x = mat [3 ]+m a t[5 ];     // x = 2 9 + 1 2

pa ra sum ar l os el em ent os d e l a c ua rta y s e xta pos ic io nes .

 C om o h em os d ich o q ue p od em os acc ede r p or pos ici ón y p or di r ec ció n: ¿ Es lo mism o
&mat [0 ] y mat?

Y &mat [1 ] = mat ++ ?

Veam os el có dig o d e un ej em p lo:

#inc lu de <stdi o.h >

#inc lu de <co ni o.h >

int m at[ 5] ={ 2, 16 , -4, 2 9, 234, 12, 0 , 3 }, i; // d ecl a rad as c omo gl oba l e s

vo id mai n ()     {

     p ri ntf (" n% d", &mat [0 ] );      // res ult ad o: 15 00 ( di r ecci ón d e m em )
                                                                                                                   ESTRUCTURADE DATOS I -- FCI




     p ri ntf (" n% p ", m at );           / /r es ulta do: 1 500 ( " " " " " )

     i ++;                                    //i =1

     p ri ntf (" n% p ", m at+ i);        // r esu ltad o: 1 502 ( " " " " " )

     p ri ntf (" n% d", * (ma t+i) );     // r esu ltad o: 16 ( va lo r de mat [1 ] o val o r

     g etch ( );       }

Ej em p lo


    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                               25
Universidad Tecnica de Manabí                            Facultad de Ciencias Informaticas

                               Pa r ec e d edu ci rs e qu e a cced em os a l os e l em en tos d el a rr a y d e d os f o r mas:

                                  - m ed iant e e l sub índ ice.

                                  - m ed iant e s u d ir ecc ió n d e m em or ia.

                               El em e nto      mat[ 0]     mat [1 ]   mat [2 ] m at[ 3] mat [4 ] mat [ 5] mat [6 ] m at[ 7]




                               Analizando las direcciones de memoria del array:




                               De lo ant e ri o r s e obt i en en v ar ias co ncl usi on es:

                                  - Es lo mism o &m at[ 0] q ue mat, & mat [2 ] q ue mat + 2

                                  - Pa r a pasa r de un e l em ent o a l si gu ie nte , es lo mism o:




                               Qu e el có dig o:
ESTRUCTURA DE DATOS I -- FCI




                               A esta fo rm a d e d es pl a za rs e e n m em o ria se l e ll ama




      26                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

Aritmética de punteros




   -   A un a va ri abl e pu nt er o se l e p ue de asi gna r la dir ec ci ón d e cua l qu i er obj eto .

   -   A un a v ar iab l e pu nt er o se le pu ed e asi gna r l a dir ec ci ón d e otr a v ar ia ble pu nte r o
       (si em p re qu e l as d os s eñ al en e l m ismo ob jet o )

   -   A un p unt e ro s e le p u e de in ici al iz ar co n el v al or N ULL

   -   Un a v a riab l e p unt e ro pu ed e se r rest ada o com pa ra da c on              ot ra si amba s
       ap unt an a el em ent os d e u n m ismo a r ra y.

   -   Se p ue de s uma r o rest ar va l or es ent e ros : p + +, p v+3 , te ni en do e n c ue nta qu e el
       des pl az ami e nto ( offs et ) de p end e d e l ti p o d e d a to a pu nta do:

       p++;      // p a pu nta a l a sigu ie nt e di r ecc ió n

       p v+=3 // p v a p unta 3* nº b ytes de l d ato a pu nt ado ( of fset)

       Si t e nem os:

       flo at *d ec ima l; / /su po nem os q ue a pu nta a 0 000

       dec ima l++;           //a p un ta a 0 004

   -   Obs e rv a r l as si gui e ntes inst ru cci on es:

                i nt * p;

                d oub l e * q;
                                                                                                                  ESTRUCTURADE DATOS I -- FCI




                v oid *r ;   // p un ter o ge né r ic o

                 p = & 34; / / l a s const ant es no t i en en dir ec ci ón

                 p = & ( i+1 ); / / las ex p r esi on es no ti en en di r ecci ón

                &i = p; // l as d ir ecc io n es n o s e pu ed e n camb ia r

                p = q;       // il e gal

                p = ( int *) q;     // l ega l



   Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                               27
Universidad Tecnica de Manabí                                Facultad de Ciencias Informaticas

                                     Uti li za nd o la aritmética de punteros nos despl az am os de u nas p osic io n es de
                                     mem or ia a ot r as. Pe r o. ¿c óm o ac ce de r a l os co nt en idos de es a s pos ic io nes
                                     util iz an do n otac ió n d e pu nt er os?




                               Em p le amos el o pe ra do r *, indirección que n os da e l co nt en ido d e la di r ecci ón d e
                               mem or ia a pu ntad a.

                               Y... ¿c óm o s e a pl ica la a rit mét ica d e pu nte r os pa r a d es pl az ar nos e n un a r ra y
                               bidim e nsi on al ?:

                                                         f lo a t mat[ 2] [4 ];    //d ecl a rac ió n d e l a r ra y




                               Uti li za nd o pu nte r os, la dec la rac ió n s e rá:

                                                           fl o at ( *mat ) [4 ]; / /a r ra y b idim e nsi on al

                               En d ond e mat es u n p unt e ro a u n g r up o co ntig u o d e a r r a ys mon od ime nsi o nal es
                               ( ve cto r es) d e 4 el em en tos ca da un o.



                               E xist e, p or tant o un a e qu i va le nci a:

                               Rec o rd emos          que      *mat
                               r ep r es enta un puntero a la
                               primera fila. A la se gund a
                               fil a n os r ef e ri mos m e dia nte
                               *(m at+1 )+j           p a ra     las
                               dir ec ci on es       y          con
ESTRUCTURA DE DATOS I -- FCI




                               *(* (m at+1 )+j )        p ar a   los
                               cont en id os.                     El
                               segu nd o        subíndi ce actua
                               sob re la co lu mna .



                               Si en         x[ 10 ][ 20 ] q u ie r o acc ed e r al e le me nto d e l a fi la 3 y la c ol umn a 6, l o h ag o
                               esc rib ie nd o x [2 ][ 5]. C o n n otac ió n d e p unt e ros , es e qu i va le nte a

                                                     * ( * ( x + 2 ) +5 )


      28                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

ya qu e x + 2 es un pu nt er o a l a fi la 3. P or t ant o. E l co nt en ido de dich o pu nte r o,
*( x+2 ), es la fi la 3. Si m e d esp la z o 5 p os ici on es e n es a fi la l l e go a l a p osi ci ón
*( x+2 )+5, cu y o c ont en i do es * (* ( x+2 )+5 ). V e r dibu jo:




Si en         x[ 10 ][ 20 ] q u ie r o acc ed e r al e le me nto d e l a fi la 3 y la c ol umn a 6, l o h ag o
esc rib ie nd o x [2 ] [5 ]. C on n otac ió n de punt e r os, lo qu e hac em os es co nsid e ra r qu e es
un a r ra y fo rm ad o p o r 10 ar ra ys u ni dim ens i o nal es (v ect o res ) d e 2 0 el em ent os cad a
un o, d e m od o qu e acc e do a x [2 ] [5 ] m ed iant e l a e x p res ió n:

            * ( * ( x + 2 ) + 5)

ya qu e x + 2 es un pu nt er o a l a fi la 3. P or t ant o. E l co nt en ido de dich o pu nte r o,
*( x+2 ), es la fi la 3. Si m e d esp la z o 5 p os ici on es e n es a fi la l l e go a l a p osi ci ón
*( x+2 )+5, cu y o c ont en i do es * (* (x +2 )+5 ). L as sigu ie nt es e x p res io n es con p unt e ros s o n
vá lid as:

**x           x [0 ] [0 ] ;         *( *( x+1 ) )      x [1 ] [0 ]

*(* x+1 )           x [0 ] [1 ];     ** (x +1 )         x [1] [0 ]

Si e n

             int a rr a y[ fi las ] [c ol umn as] ;

Qu i er o acc ed e r a l el e ment o a r ra y [ y ][ z ] p a ra asign a rl e un va l or , lo qu e e l com p il ad or
hac e es :

            *(*array +columnas x y + z)) = 129; / /asig nac ió n

Si f ue r a int a r ra y [2 ] [5 ] y q uisi e ra as ig na r 12 9 al e le me nto d e l a fi l a 1 y co lu mna 2 ,
po nd rí a:
                                                                                                                       ESTRUCTURADE DATOS I -- FCI




               * (a r ra y + 5x1 + 1 )) = 129 ;

es d eci r, des de e l or ig e n d el ar r a y a va n za 6 po sici on es d e m em o ri a:




      Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                                 29
Universidad Tecnica de Manabí                                     Facultad de Ciencias Informaticas


                               PUNTEROS A ARRAYS MATRICES
                               Un a r ra y m ult idim e nsi on al es, en r e ali dad, una co l ecci ón d e vect or es. S eg ún est o,
                               po de mos       d ef in ir un ar ra y b idi me nsi on al c o mo u n p unt e r o a u n g ru p o co nti gu o d e
                               ar ra ys un id ime nsi o nal e s. Las d ec la rac io n es si gui ent es s on e q ui va l en tes:

                                              int dat [fi l ] [co l ]       i nt (*d at) [c ol ]

                               En g en e ra l:

                               tip o_d ato no mb re [d im1 ] [dim 2] . . . . . [di mp ]; e q ui va le a:

                               tip o_d ato (* no mb re ) [di m2] [d im3 ]. . . . . [d im p ];




                               El a r ra y:       i nt va l or [ x ][ y ] [z ];

                               Pu ed e s e r re p r ese nta d o en la fo rm a:

                                                        i nt (* va lo r ) [y ] [ z] ;




                               O c om o u n AR R A Y D E P UN T ER O S:

                                                           int * v al or [ x ][ y ];



                                                            s in p a r ént esis

                               En su nu e va dec la r aci ó n d esa pa r ec e l a ú ltim a de s us di me nsi on es.

                               Veam os m ás d ecl a rac io nes de a rr a ys d e p unt e ros :
ESTRUCTURA DE DATOS I -- FCI




                                                     int x [10 ] [20 ];                       int * x[ 10 ];

                                                     flo at p [10 ] [20 ] [30 ];             int * p[ 10 ][ 20 ];




      30                         Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

Punteros a CADENAS DE CARACTERES

Un a c ad ena d e c ar act e r es es u n ar r ay d e c ar a cte res . La f or ma de d e fin i r u n pu nt er o a
una cad e na d e c a ract e r es:

                              c ha r *ca de na;

El id ent if icad o r d el ar ra y es l a di r ecc ió n d e comi e nz o d el a rr a y. Pa r a sab e r dó nd e
ter mi na la c ad en a, el c om pi lad o r a ñad e el ca r ácte r ‘ 0’ ( A SCI I 0, N UL L):

cha r * nomb r e = “ P E P E P ER E Z ”;




ARRAYS DE PUNTEROS A CADENAS DE CARACTERES
En un a r ra y d e pu nte r o s a cade nas d e ca r acte r es cad a el em e nto a p u nta a u n ca ráct e r.
La d ecl a rac ió n s er á:

cha r *c ad [10 ]; // po r e jem p lo

Grá fic am ent e p od ría se r:
                                                                                                                   ESTRUCTURADE DATOS I -- FCI




    -   si l as di me nsi on es no son c o noc idas , sab r em os d ónd e c om ie n zan l a s cad en as,
        p er o no d ó nde t e rm ina n. Pa ra el l o se ef ect úa la l la mad a reserva dinámica de
        memoria (funci o nes ma ll oc, c al loc ( ), r ea ll oc ( ) y fr e e () de stdl ib.h ó al l oc.h ):

                         cha r c ad[ 10 ][ 80 ];

        E qu i va le a      ch ar **ca d r es er v and o 8 00 b yt es


    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                               31
Universidad Tecnica de Manabí                               Facultad de Ciencias Informaticas

                                      La d ecl a rac ió n:

                                                             c ha r ca d[10 ] [80 ];

                                      Res e rv a me mo ri a p ar a 10 cade nas de c ar ac ter es d e80 ca ra cte r es cada un a.
                                      P er o en l a d ecl ar ac ió n com o a r ra y d e p unt e ros :

                                                             c ha r * cad [10 ];

                                      El co mp il ad or d esco n oc e el t ama ño de l as cad en as: ¿ cuá nta me mo ri a r ese r va ?

                                  -   si e l a r ra y es stat ic y s e i nic ia li za n l as c ade nas e n e l p ro pi o códi go , e l
                                      com pi lad o r c alc ul a l a d ime nsi ón n o ex p lic itad a (a r ra ys s in dim e nsi ón ex p líc ita ).




                               OTRAS CLASES DE PUNTEROS:
                                        P unt e ros ge n ér ic os: S on t i po v oi d:

                                                       v oid *g en e ric o;

                                      Los p unt e r os ti po v oid pu ed en a pu nta r a ot r o tip o d e dat os. Es un a op e rac ió n
                                      del ica da q u e d e pe nd e d el ti p o d e c om pi la do r. Es c o nv e ni ent e em pl ea r e l
                                      “cast in g” pa ra l a c on v e rsi ón. Aú n as í, n o tod a s las c on v e rsi on es están
                                      p er miti das.

                                        P unt e ro nu lo: En C u n pu nte r o qu e a pu nte a un o bj et o vá li do n un ca tend rá un
                                      va lo r ce r o. E l va lo r c e r o s e ut il iz a pa ra i ndic a r qu e ha oc ur r id o a lgú n e r r or (e s
                                      dec ir , qu e a lg un a o p e ra ció n n o s e h a po did o r e ali za r )

                                                   int * p = N UL L;      // int * p =0;

                                         Pu nte r os c onst ant es : U na d ec la ra ci ón de p u nte r o pr ec ed ida de co n st hac e
                                      qu e e l ob j eto a pu ntad o sea un a c onst ant e (a u nq u e n o el p unt e ro ):

                                                   co nst ch a r * p = “V al lad ol id ”;

                                                   p [0 ] = ‘f’ // e r ro r. La c ad ena a pu nta da po r + es cte .

                                                   p = “ Puc el a ” //Ok . p a p unta a ot ra cade na .

                                      Si l o qu e qu e r emos es dec la ra r un p unt e ro co nstant e;

                                                   cha r *co nst p = “ M edi na ”;

                                                   p [0 ] = ‘s’; // e rr o r: el ob jet o “ Me di n a”, es cte.
ESTRUCTURA DE DATOS I -- FCI




                                                  p = “ P eñ af ie l ”; //e r ro r: e l pu nte r o p e s const ant e.

                                         Punt e r os a p unt e ros:

                                      Ve r   ej em p4.c p p,     ej e mp11 .c pp y ej em p12.c p p

                                             int ** pu nte r o; // pu nt er o a punt e r o a un obj eto i nt.

                                      El ti p o de ob jet o a pu ntad o des pu és d e un a dobl e in d i re cci ón pu e de se r de
                                      cua lq ui e r c las e.


      32                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                              Facultad de Ciencias Informaticas

    P er mit e ma ne ja r a r ra ys d e mú lti p les d im e nsi on es c on n otac io ne s d el t i p o
    ***mat,       d e múlt i pl e ind i re cci ón q ue pu ed en g en e ra r p r obl e mas si el
    trat ami ent o no es el adec ua do. O j o a los “ p unt er os lo cos ”.

      Punt e r os a dat os c o mp le jos: S e pu ed en d ecl a ra pu nte r os a d at os de fi nid os
    po r e l us ua ri o (t y pe de f( ) ), a dat os st ruct, a fun ci on es, c om o a rg u ment os d e
    func i on es...

    Dec la rac io n es c om pl ej as:

     U na d ec la rac ió n c om pl ej a es un id ent ifi cad o r con más d e d e u n op e r ado r. P ar a
    int er p r eta r  estas       d ecl a rac io nes  hac e f a lta sab e r qu e los c o r chet es        y
    pa r ént esis (o p e rad o r es a la de r ech a de l ide n tific ad or ti en e n p ri or i dad sob re
    los aste ris cos (o p e ra do res a l a iz q ui e rda d el id e ntif ica do r. L os p ar ént es is y
    co rch etes ti en e n l a m i sma p ri or id ad y s e e va lúa n d e i z qui e rd a a d e r echa . A la
    iz q ui er da de l t od o el t ip o d e dat o. Em pl e and o p ar é ntes is s e pu ed e cambi ar el
    or de n d e p ri o ri dad es. Las e x pr esi o nes ent r e pa r ént esis s e e v al úan p rim e ro , de
    más i nte r nas a más e xt e rnas .

    Pa r a i nte r p r eta r d ecl a r aci on es c om pl ej as p od em os se gu ir e l or de n:

     1) Em p ez ar c on e l i dent if icad o r y ve r si haci a la d er ec ha ha y co rch etes o
    pa r ént esis .

     2) I nte r p r eta r es os c or ch etes o p ar é ntes is y v e r si ha cia la i z q ui er da h ay
    aste risc os.

      3 ) D ent ro de cad a ni v el d e pa r ént esis , d e más int e rn os a má s ext e rn os,
    ap lic a r pu ntos 1 y 2.

    Veam os un ej em p lo:

                            cha r *(* (* va r ) ( ) )[ 10 ]




    La i nte r p r etac ió n es:

    1. La v ar iab l e va r es d e cla rad a c om o

    2. u n punt e r o a

    3. u na f un ci ón q ue d ev ue l ve

    4. u n punt e r o a
                                                                                                              ESTRUCTURADE DATOS I -- FCI




    5. u n a r ra y d e 1 0 el em ent os, los cua l es so n

    6. p unt e ros a

    7. ob jet os d e t i po cha r.




Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                              33
Universidad Tecnica de Manabí                         Facultad de Ciencias Informaticas



                               Punteros a estructuras

                               Cómo no, también se pueden usar punteros con estructuras. Vamos a ver como funciona esto de los
                               punteros con estructuras. Primero de todo hay que definir la estructura de igual forma que hacíamos antes.
                               La diferencia está en que al declara la variable de tipo estructura debemos ponerle el operador '*' para
                               indicarle que es un puntero.

                               Creo que es importante recordar que un puntero no debe apuntar a un lugar cualquiera, debemos darle
                               una dirección válida donde apuntar. No podemos por ejemplo crear un puntero a estructura y meter los
                               datos directamente mediante ese puntero, no sabemos dónde apunta el puntero y los datos se
                               almacenarían en un lugar cualquiera.

                               Y para comprender cómo funcionan, nada mejor que un ejemplo. Este programa utiliza un puntero para
                               acceder a la información de la estructura:

                               #include <stdio.h>
                               struct estructura_amigo {
                                     char nombre[30];
                                     char apellido[40];
                                     char telefono[10];
                                     int edad;
                                     };
                               struct estructura_amigo amigo = {
                                    "Juanjo",
                                    "Lopez",
                                    "592-0483",
                                    30
                                    };
                               struct estructura_amigo *p_amigo;
                               int main()
                                   {
                                   p_amigo = &amigo;
                                   printf( "%s tiene ", p_amigo->apellido );
                                   printf( "%i años ", p_amigo->edad );
                                   printf( "y su teléfono es el %s.n" , p_amigo->telefono );
                                   }


                               Has la definición del puntero p_amigo vemos que todo era igual que antes. p_amigo es un puntero a la
                               estructura estructura_amigo. Dado que es un puntero tenemos que indicarle dónde debe apuntar, en este
                               caso vamos a hacer que apunte a la variable amigo:

                                  p_amigo = &amigo;

                               No debemos olvidar el operador & que significa 'dame la dirección donde está almacenado...'.
ESTRUCTURA DE DATOS I -- FCI




                               Ahora queremos acceder a cada campo de la estructura. Antes lo hacíamos usando el operador '.', pero,
                               como muestra el ejemplo, si se trabaja con punteros se debe usar el operador '->'. Este operador viene a
                               significar algo así como: "dame acceso al miembro ... del puntero ...".

                               Ya sólo nos queda saber cómo podemos utilizar los punteros para introducir datos en las estructuras. Lo
                               vamos a ver un ejemplo:

                               #include <stdio.h>
                               struct estructura_amigo {
                                   char nombre[30];


      34                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

     char apellido[40];
     int edad;
     };
struct estructura_amigo amigo, *p_amigo;
void main()
   {
   p_amigo = &amigo;
   /* Introducimos los datos mediante punteros */
   printf("Nombre: ");fflush(stdout);
   gets(p_amigo->nombre);
   printf("Apellido: ");fflush(stdout);
   gets(p_amigo->apellido);
   printf("Edad: ");fflush(stdout);
   scanf( "%i", &p_amigo->edad );
    /* Mostramos los datos */
    printf( "El amigo %s ", p_amigo->nombre );
    printf( "%s tiene ", p_amigo->apellido );
    printf( "%i años.n", p_amigo->edad );
    }
NOTA: p_amigo es un puntero que apunta a la estructura amigo. Sin embargo p_amigo->edad es una
variable de tipo int. Por eso al usar el scanf tenemos que poner el &.




                                                                                                        ESTRUCTURADE DATOS I -- FCI




   Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                     35
Universidad Tecnica de Manabí                        Facultad de Ciencias Informaticas


                               Punteros a Arrays de estructuras

                               Por supuesto también podemos usar punteros con arrays de estructuras. La forma de trabajar es la misma,
                               lo único que tenemos que hacer es asegurarnos que el puntero inicialmente apunte al primer elemento,
                               luego saltar al siguiente hasta llegar al último.

                               #include <stdio.h>
                               #define ELEMENTOS        3
                               struct estructura_amigo {
                                   char nombre[30];
                                   char apellido[40];
                                   char telefono[10];
                                   int edad;
                                   };

                               struct estructura_amigo amigo[] =
                                   {
                                   "Juanjo", "Lopez", "504-4342", 30,
                                   "Marcos", "Gamindez", "405-4823", 42,
                                   "Ana", "Martinez", "533-5694", 20
                                   };

                               struct estructura_amigo *p_amigo;
                               void main()
                                  {
                                  int num_amigo;
                                  p_amigo = amigo; /* apuntamos al primer elemento del array */

                                 /* Ahora imprimimos sus datos */
                                 for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ )
                                    {
                                    printf( "El amigo %s ", p_amigo->nombre );
                                    printf( "%s tiene ", p_amigo->apellido );
                                    printf( "%i años ", p_amigo->edad );
                                    printf( "y su teléfono es el %s.n" , p_amigo->telefono );
                                    /* y ahora saltamos al siguiente elemento */
                                    p_amigo++;
                                    }
                                 }


                               En vez de p_amigo = amigo; se podía usar la forma p_amigo = &amigo[0];, es decir que apunte al primer
                               elemento (el elemento 0) del array. La primera forma creo que es más usada pero la segunda quizás indica
                               más claramente al lector principiante lo que se pretende.

                               Ahora veamos el ejemplo anterior de cómo introducir datos en un array de estructuras mediante punteros:
ESTRUCTURA DE DATOS I -- FCI




                               #include <stdio.h>
                               #define ELEMENTOS        3
                               struct estructura_amigo {
                                   char nombre[30];
                                   char apellido[40];
                                   int edad;
                                   };

                               struct estructura_amigo amigo[ELEMENTOS], *p_amigo;

                               void main()


      36                        Manual de Estructura de Datos
Universidad Tecnica de Manabí                             Facultad de Ciencias Informaticas

  {
  int num_amigo;
  /* apuntamos al primer elemento */
  p_amigo = amigo;

  /* Introducimos los datos mediante punteros */
  for ( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ )
     {
     printf("Datos amigo %in",num_amigo);
     printf("Nombre: ");fflush(stdout);
     gets(p_amigo->nombre);
     printf("Apellido: ");fflush(stdout);
     gets(p_amigo->apellido);
     printf("Edad: ");fflush(stdout);
     scanf( "%i", &p_amigo->edad );
     /* vaciamos el buffer de entrada */
     while(getchar()!='n');
     /* saltamos al siguiente elemento */
     p_amigo++;
     }
  /* Ahora imprimimos sus datos */
  p_amigo = amigo;
  for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ )
      {
      printf( "El amigo %s ", p_amigo->nombre );
      printf( "%s tiene ", p_amigo->apellido );
      printf( "%i años.n", p_amigo->edad );
      p_amigo++;
      }
  }


Es importante no olvidar que al terminar el primer bucle for el puntero p_amigo apunta al último elemento
del array de estructuras. Para mostrar los datos tenemos que hacer que vuelva a apuntar al primer
elemento y por eso usamos de nuevo p_amigo=amigo; (en negrita).




                                                                                                            ESTRUCTURADE DATOS I -- FCI




    Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres                                                                        37
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i
Modulo  -estructura_de_datos_i

Más contenido relacionado

La actualidad más candente

Uribesoto (1).pptx sistemas
Uribesoto (1).pptx sistemasUribesoto (1).pptx sistemas
Uribesoto (1).pptx sistemasZAYRA URIBE SOTO
 
Sistemas de información
Sistemas de informaciónSistemas de información
Sistemas de informaciónDavidFrndz
 
unidad 2 Informatica aplicada
unidad 2 Informatica aplicadaunidad 2 Informatica aplicada
unidad 2 Informatica aplicadaAndrea Fermini
 
Sistemas De InformacióN Para La Toma De Decisiones
Sistemas De InformacióN Para La Toma De DecisionesSistemas De InformacióN Para La Toma De Decisiones
Sistemas De InformacióN Para La Toma De DecisionesTania Mendoza
 
Unidad 2 sistemas de informacion mejorado
Unidad 2 sistemas de informacion mejoradoUnidad 2 sistemas de informacion mejorado
Unidad 2 sistemas de informacion mejoradokarlos18
 
Unidad 2 sistemas de informacion karlos
Unidad 2 sistemas de informacion karlos Unidad 2 sistemas de informacion karlos
Unidad 2 sistemas de informacion karlos karlos18
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacionsaulgerardo21
 
Sistemas de información uabc fca krpm
Sistemas de información uabc fca krpmSistemas de información uabc fca krpm
Sistemas de información uabc fca krpmjonathanv3c
 
UNIDAD II SISTEMAS DE INFORMACION
UNIDAD II SISTEMAS DE INFORMACION UNIDAD II SISTEMAS DE INFORMACION
UNIDAD II SISTEMAS DE INFORMACION AngelesGL
 
UNIDAD II SISTEMAS DE INFORMACION
UNIDAD II SISTEMAS DE INFORMACIONUNIDAD II SISTEMAS DE INFORMACION
UNIDAD II SISTEMAS DE INFORMACIONDaniaChang
 
Sistemas kelly
Sistemas kellySistemas kelly
Sistemas kellykelly leor
 
Sistemas de información unidad ii
Sistemas de información unidad iiSistemas de información unidad ii
Sistemas de información unidad iisilvia alba
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacionjohanagb
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacionsaulgerardo21
 
Unidad II Sistemas de informacion
Unidad II Sistemas de informacionUnidad II Sistemas de informacion
Unidad II Sistemas de informacionUABC
 

La actualidad más candente (19)

Uribesoto (1).pptx sistemas
Uribesoto (1).pptx sistemasUribesoto (1).pptx sistemas
Uribesoto (1).pptx sistemas
 
Tics2do
Tics2doTics2do
Tics2do
 
Sistemas de información
Sistemas de informaciónSistemas de información
Sistemas de información
 
unidad 2 Informatica aplicada
unidad 2 Informatica aplicadaunidad 2 Informatica aplicada
unidad 2 Informatica aplicada
 
Sistemas De InformacióN Para La Toma De Decisiones
Sistemas De InformacióN Para La Toma De DecisionesSistemas De InformacióN Para La Toma De Decisiones
Sistemas De InformacióN Para La Toma De Decisiones
 
Unidad 2 sistemas de informacion mejorado
Unidad 2 sistemas de informacion mejoradoUnidad 2 sistemas de informacion mejorado
Unidad 2 sistemas de informacion mejorado
 
Unidad 2 sistemas de informacion karlos
Unidad 2 sistemas de informacion karlos Unidad 2 sistemas de informacion karlos
Unidad 2 sistemas de informacion karlos
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacion
 
Sistemas de información
Sistemas de informaciónSistemas de información
Sistemas de información
 
Sistemas de información uabc fca krpm
Sistemas de información uabc fca krpmSistemas de información uabc fca krpm
Sistemas de información uabc fca krpm
 
UNIDAD II SISTEMAS DE INFORMACION
UNIDAD II SISTEMAS DE INFORMACION UNIDAD II SISTEMAS DE INFORMACION
UNIDAD II SISTEMAS DE INFORMACION
 
Presentatio n adrian
Presentatio n adrianPresentatio n adrian
Presentatio n adrian
 
UNIDAD II SISTEMAS DE INFORMACION
UNIDAD II SISTEMAS DE INFORMACIONUNIDAD II SISTEMAS DE INFORMACION
UNIDAD II SISTEMAS DE INFORMACION
 
Sistemas kelly
Sistemas kellySistemas kelly
Sistemas kelly
 
Sistemas de información unidad ii
Sistemas de información unidad iiSistemas de información unidad ii
Sistemas de información unidad ii
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacion
 
Unidad ii
Unidad iiUnidad ii
Unidad ii
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacion
 
Unidad II Sistemas de informacion
Unidad II Sistemas de informacionUnidad II Sistemas de informacion
Unidad II Sistemas de informacion
 

Similar a Modulo -estructura_de_datos_i

Sistemas de informacion para la toma de decisiones
Sistemas de informacion para la toma de decisionesSistemas de informacion para la toma de decisiones
Sistemas de informacion para la toma de decisionesMaria Garces
 
Sistema De Informacion
Sistema De InformacionSistema De Informacion
Sistema De Informacionerikamolina
 
Sistemas de Información. Ensayo. MAYRA MADRID
Sistemas de Información. Ensayo. MAYRA MADRIDSistemas de Información. Ensayo. MAYRA MADRID
Sistemas de Información. Ensayo. MAYRA MADRIDMayra Madrid Castillo
 
Sistemas De Informacion En La Empresa
Sistemas De Informacion En La EmpresaSistemas De Informacion En La Empresa
Sistemas De Informacion En La EmpresaFinancieros2008
 
Admin. de sistema de información.toma de decisiones
Admin. de sistema de información.toma de decisionesAdmin. de sistema de información.toma de decisiones
Admin. de sistema de información.toma de decisionesGerardo Valera
 
Modul_ I_ info_adminempresa_parte1
Modul_ I_ info_adminempresa_parte1Modul_ I_ info_adminempresa_parte1
Modul_ I_ info_adminempresa_parte1Cecilia Medina
 
Sistemas de información empresariales y erp
Sistemas de información empresariales y erpSistemas de información empresariales y erp
Sistemas de información empresariales y erpmfdacv
 
Sistemas de información empresariales y erp
Sistemas de información empresariales y erpSistemas de información empresariales y erp
Sistemas de información empresariales y erpmfdacv
 
Clasificación Sistemas de información empresariales y erp
Clasificación Sistemas de información empresariales y erpClasificación Sistemas de información empresariales y erp
Clasificación Sistemas de información empresariales y erpmfdacv
 
Los sistemas-de-informacion
Los sistemas-de-informacionLos sistemas-de-informacion
Los sistemas-de-informacionalex1658
 
Sistemas de informacion modificado
Sistemas de informacion modificadoSistemas de informacion modificado
Sistemas de informacion modificadozaira
 
Sistemas de información
Sistemas de informaciónSistemas de información
Sistemas de informaciónNena Mrtnz Leis
 
Mapa conceptual sistema de clasificacion y objetivos
Mapa conceptual sistema de clasificacion y objetivosMapa conceptual sistema de clasificacion y objetivos
Mapa conceptual sistema de clasificacion y objetivoskaren johana daza
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacionyurnio
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacionyurnio
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacionyurnio
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacionyurnio
 

Similar a Modulo -estructura_de_datos_i (20)

Sistemas de informacion para la toma de decisiones
Sistemas de informacion para la toma de decisionesSistemas de informacion para la toma de decisiones
Sistemas de informacion para la toma de decisiones
 
Tarea Nº1
Tarea Nº1Tarea Nº1
Tarea Nº1
 
Sistema De Informacion
Sistema De InformacionSistema De Informacion
Sistema De Informacion
 
Sistemas de Información. Ensayo. MAYRA MADRID
Sistemas de Información. Ensayo. MAYRA MADRIDSistemas de Información. Ensayo. MAYRA MADRID
Sistemas de Información. Ensayo. MAYRA MADRID
 
Sistemas De Informacion En La Empresa
Sistemas De Informacion En La EmpresaSistemas De Informacion En La Empresa
Sistemas De Informacion En La Empresa
 
Admin. de sistema de información.toma de decisiones
Admin. de sistema de información.toma de decisionesAdmin. de sistema de información.toma de decisiones
Admin. de sistema de información.toma de decisiones
 
Modul_ I_ info_adminempresa_parte1
Modul_ I_ info_adminempresa_parte1Modul_ I_ info_adminempresa_parte1
Modul_ I_ info_adminempresa_parte1
 
Ts
TsTs
Ts
 
Sistemas de información empresariales y erp
Sistemas de información empresariales y erpSistemas de información empresariales y erp
Sistemas de información empresariales y erp
 
Sistemas de información empresariales y erp
Sistemas de información empresariales y erpSistemas de información empresariales y erp
Sistemas de información empresariales y erp
 
Clasificación Sistemas de información empresariales y erp
Clasificación Sistemas de información empresariales y erpClasificación Sistemas de información empresariales y erp
Clasificación Sistemas de información empresariales y erp
 
Los sistemas-de-informacion
Los sistemas-de-informacionLos sistemas-de-informacion
Los sistemas-de-informacion
 
Sistemas de informacion modificado
Sistemas de informacion modificadoSistemas de informacion modificado
Sistemas de informacion modificado
 
Sistemas de información
Sistemas de informaciónSistemas de información
Sistemas de información
 
Mapa conceptual sistema de clasificacion y objetivos
Mapa conceptual sistema de clasificacion y objetivosMapa conceptual sistema de clasificacion y objetivos
Mapa conceptual sistema de clasificacion y objetivos
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacion
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacion
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacion
 
Sistemas de informacion
Sistemas de informacionSistemas de informacion
Sistemas de informacion
 
sistemas de infromacion
sistemas de infromacionsistemas de infromacion
sistemas de infromacion
 

Modulo -estructura_de_datos_i

  • 1. UNIVERSIDAD TECNICA DE MANABÍ FACULTAD DE CIENCIAS INFORMATICAS ESTRUCTURA DE DATOS I PROGRAMACIÓN EN C++ “Lo importante en un individuo, no es lo que piensa, sino lo que hace” J. Watson FACULTAD DE CIENCIAS INFORMATICAS FCI - 2008 Autores: Ing. Esthela San Andres Ing. Christian Torres
  • 2. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas ESTRUCTURA DE DATOS I PROGRAMACIÓN EN C++ Sistema de Información Introducción.- Un sistema de información es un conjunto de elementos que interactúan entre sí con el fin de apoyar las actividades de una empresa o negocio. El equipo computacional: el hardware necesario para que el sistema de información pueda operar. El recurso humano que interactúa con el Sistema de Información, el cual está formado por las personas que utilizan el sistema. Un sistema de información realiza cuatro actividades básicas: entrada, almacenamiento, procesamiento y salida de información. Entrada de Información: Es el proceso mediante el cual el Sistema de Información toma los datos que requiere para procesar la información. Las entradas pueden ser manuales o automáticas. Las manuales son aquellas que se proporcionan en forma directa por el usuario, mientras que las automáticas son datos o información que provienen o son tomados de otros sistemas o módulos. Esto último se denomina interfases automáticas. Las unidades típicas de entrada de datos a las computadoras son las terminales, las cintas magnéticas, las unidades de diskette, los códigos de barras, los escáners, la voz, los monitores sensibles al tacto, el teclado y el mouse, entre otras. Almacenamiento de información: El almacenamiento es una de las actividades o capacidades más importantes que tiene una computadora, ya que a través de esta propiedad el sistema puede recordar la información guardada en la sección o proceso anterior. Esta información suele ser almacenada en estructuras de información denominadas archivos. La unidad típica de almacenamiento son los discos magnéticos o discos duros, los discos flexibles o diskettes y los discos compactos (CD-ROM). Procesamiento de Información: Es la capacidad del Sistema de Información para efectuar cálculos de acuerdo con una secuencia de operaciones preestablecida. Estos cálculos pueden efectuarse con datos introducidos recientemente en el sistema o bien con datos que están almacenados. Esta característica de los sistemas permite la transformación de datos fuente en información que puede ser utilizada para la toma de decisiones, lo que hace posible, entre otras cosas, que un tomador de decisiones genere una ESTRUCTURADE DATOS I -- FCI proyección financiera a partir de los datos que contiene un estado de resultados o un balance general de un año base. Salida de Información: La salida es la capacidad de un Sistema de Información para sacar la información procesada o bien datos de entrada al exterior. Las unidades típicas de salida son las impresoras, terminales, diskettes, cintas magnéticas, la voz, los graficadores y los plotters, entre otros. Es importante aclarar que la salida de un Sistema de Información puede constituir la entrada a otro Sistema de Información o módulo. En este caso, también existe una interfase automática de salida. Por ejemplo, el Sistema de Control de Clientes tiene una interfase automática de salida con el Sistema de Contabilidad, ya que genera las pólizas contables de los movimientos procesales de los clientes. Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 1
  • 3. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas A continuación se muestran las diferentes actividades que puede realizar un Sistema de Información de Control de Clientes: Actividades que realiza un Sistema de Información: Entradas: • Datos generales del cliente: nombre, dirección, tipo de cliente, etc. • Políticas de créditos: límite de crédito, plazo de pago, etc. • Facturas (interfase automático). • Pagos, depuraciones, etc. Proceso: • Cálculo de antigüedad de saldos. • Cálculo de intereses moratorios. • Cálculo del saldo de un cliente. Almacenamiento: • Movimientos del mes (pagos, depuraciones). • Catálogo de clientes. • Facturas. Salidas: • Reporte de pagos. • Estados de cuenta. • Pólizas contables (interfase automática) • Consultas de saldos en pantalla de una terminal. Las diferentes actividades que realiza un Sistema de Información se pueden observar en el diseño conceptual ilustrado en la en la figura 1.1. ESTRUCTURA DE DATOS I -- FCI Actividades que realiza un Sistema de Información, figura 1.1 2 Manual de Estructura de Datos
  • 4. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Tipos y Usos de los Sistemas de Información Durante los próximos años, los Sistemas de Información cumplirán tres objetivos básicos dentro de las organizaciones: 1. Automatización de procesos operativos. 2. Proporcionar información que sirva de apoyo al proceso de toma de decisiones. 3. Lograr ventajas competitivas a través de su implantación y uso. Los Sistemas de Información que logran la automatización de procesos operativos dentro de una organización, son llamados frecuentemente Sistemas Transaccionales, ya que su función primordial consiste en procesar transacciones tales como pagos, cobros, pólizas, entradas, salidas, etc. Por otra parte, los Sistemas de Información que apoyan el proceso de toma de decisiones son los Sistemas de Soporte a la Toma de Decisiones, Sistemas para la Toma de Decisión de Grupo, Sistemas Expertos de Soporte a la Toma de Decisiones y Sistema de Información para Ejecutivos. El tercer tipo de sistema, de acuerdo con su uso u objetivos que cumplen, es el de los Sistemas Estratégicos, los cuales se desarrollan en las organizaciones con el fin de lograr ventajas competitivas, a través del uso de la tecnología de información. Los tipos y usos de los Sistemas de Información se muestran en la figura 1.2. A continuación se mencionan las principales características de estos tipos de Sistemas de Información. Sistemas Transaccionales. Sus principales características son: • A través de éstos suelen lograrse ahorros significativos de mano de obra, debido a que automatizan tareas operativas de la organización. ESTRUCTURADE DATOS I -- FCI • Con frecuencia son el primer tipo de Sistemas de Información que se implanta en las organizaciones. Se empieza apoyando las tareas a nivel operativo de la organización. • Son intensivos en entrada y salid de información; sus cálculos y procesos suelen ser simples y poco sofisticados. • Tienen la propiedad de ser recolectores de información, es decir, a través de estos sistemas se cargan las grandes bases de información para su explotación posterior. • Son fáciles de justificar ante la dirección general, ya que sus beneficios son visibles y palpables. Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 3
  • 5. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Sistemas de Apoyo de las Decisiones. Las principales características de estos son: • Suelen introducirse después de haber implantado los Sistemas Transaccionales más relevantes de la empresa, ya que estos últimos constituyen su plataforma de información. • La información que generan sirve de apoyo a los mandos intermedios y a la alta administración en el proceso de toma de decisiones. • Suelen ser intensivos en cálculos y escasos en entradas y salidas de información. Así, por ejemplo, un modelo de planeación financiera requiere poca información de entrada, genera poca información como resultado, pero puede realizar muchos cálculos durante su proceso. • No suelen ahorrar mano de obra. Debido a ello, la justificación económica para el desarrollo de estos sistemas es difícil, ya que no se conocen los ingresos del proyecto de inversión. • Suelen ser Sistemas de Información interactivos y amigables, con altos estándares de diseño gráfico y visual, ya que están dirigidos al usuario final. • Apoyan la toma de decisiones que, por su misma naturaleza son repetitivos y de decisiones no estructuradas que no suelen repetirse. Por ejemplo, un Sistema de Compra de Materiales que indique cuándo debe hacerse un pedido al proveedor o un Sistema de Simulación de Negocios que apoye la decisión de introducir un nuevo producto al mercado. • Estos sistemas pueden ser desarrollados directamente por el usuario final sin la participación operativa de los analistas y programadores del área de informática. • Este tipo de sistemas puede incluir la programación de la producción, compra de materiales, flujo de fondos, proyecciones financieras, m od el os d e si mul aci ón de n eg oci os, mod el os d e in v enta r ios, etc . Sistemas Estratégicos. Sus principales características son: • Su función primordial no es apoyar la automatización de procesos operativos ni proporcionar información para apoyar la toma de decisiones. • Suelen desarrollarse in house, es decir, dentro de la organización, por lo tanto no pueden adaptarse fácilmente a paquetes disponibles en el mercado. • Típicamente su forma de desarrollo es a base de incrementos y a través de su evolución dentro de la organización. Se inicia con un proceso o función en particular y a partir de ahí se van agregando nuevas funciones o procesos. • Su función es lograr ventajas que los competidores no posean, tales como ventajas en costos y servicios diferenciados con clientes y proveedores. En este contexto, los Sistema Estratégicos son creadores de barreras de entrada al negocio. Por ejemplo, el uso de cajeros automáticos en los bancos en un Sistema Estratégico, ya que brinda ventaja sobre un banco que no posee tal servicio. Si un banco nuevo decide abrir sus puertas al público, tendrá que dar este servicio para tener un nivel similar al de sus competidores. ESTRUCTURA DE DATOS I -- FCI • Apoyan el proceso de innovación de productos y proceso dentro de la empresa debido a que buscan ventajas respecto a los competidores y una forma de hacerlo en innovando o creando productos y procesos. 4 Manual de Estructura de Datos
  • 6. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Tipos de datos Bit. U nid ad de in fo rm ac ió n más s e nci ll a en el s istem a bi na r io. B yte. Un idad d e i nf o r maci ón qu e c onst a d e 8 bits e qu i va le nt e a u n ú ni co car áct er , c omo un a let r a, n úm er o o si gn o d e p untu aci ó n. Ca ráct e r. Es u n el em ent o to mad o d e u n con ju nto d e s ímb ol os . E jem p lo : a,b,c,0 ,1,%= … Pa lab r a. C o nju nt o d e bi ts q ue p ue de n s e r ma ni pu lad o s p o r u na c om pu tado ra . La l o ngit ud de u na p a lab ra e n un a c om put a do ra p ue de se r: 8, 16 , 31, etc. De p end e d e l Mic r op r oc esad o r Manipulación de bits Digit al iz aci ó n de la in f or mac ió n. Se c o nv i ert e te xt o, so ni do o imág e nes e n f o rmat o q ue p ue de s e r ent e ndid o p or l a PC. Los m ic ro p ro ces ad or es ent ie nd en e l f o rmat o d e 0,1´s . Los m ic ro p r oc esad o res det ect an cu and o un b it s e c ar ga y su va lo r es igu al a 1 Se p u ed en r e pr es ent a r u na g ran di v e rsid ad de va l or es: ve rd a d y fa lso, fem en in o y m ascu li n o, etc. La e fic i enc ia d e las pc´ s no se basa e n l a c om pl ej id ad d e s u l óg ica La e fic i enc ia d e las pc´ s se b asa en la v e loc id ad d e t rab aj o. Ej em p lo de co mbi nac io nes p osib l es: 2 bits , 8 bits Si s e uti li zan 8 bits pa ra re p r ese nta r u n ca rá cte r, se pu ed en re p r es ent ar h asta 256 ca ract e res d if e re n tes, p u esto qu e ex iste n 256 p at ro n es o co m bina ci on es dif e re ntes d e 8 b its. Los com p utad o res d if i e re n co n r es pe cto a l núm er o d e bits uti li zad os p a ra r ep r es enta r un ca ráct e r Clasificación de los tipos de datos En fu nc ió n d e qu i en los def in e: o Ti p os d e d atos está nd a r. o Ti p os d e d atos de fi nid o s p or e l us ua r io En fu nc ió n d e l a r ep r es ent aci ón int e rn a: Ti p os d e d atos esc al ar es o sim p les ESTRUCTURADE DATOS I -- FCI o o Ti p os d e d atos est ruct u rad os. Los ti p os d e d atos sim pl es s on l os si gui e ntes : ◦ Numé r ic os ( Int eg e r, R e al ) · ◦ Lóg icos ( B oo le an ) · ◦ Ca ráct e r (C ha r, St ri ng ) · Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 5
  • 7. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Representación de datos simples Dato. R e pr es ent aci ón f or ma d e hec hos , c onc e ptos o inst r ucci o nes Ti p o de dat o. Un co nj u nto d e va l or es, a q ue ll o s qu e p ue de to ma r cua lq ui e r dat o de d ich o t ip o. Las va r iab les y co nsta ntes qu e fo rm an pa rte de un p r og ram a p e rte nec e n a u n ti p o de d a t os d et er mi nad o. De esta f or ma, los va l or es as oci ad o s a dichas va r iab les (o co nsta ntes ) p ue de n o pe r ar c on ot r os d e ac ue rd o a s u nat ur al ez a ( p . e. d os nú me r os e nte r o s pu ed en s e r mu lti pl ic ados p er o n o ti e ne s e ntid o ha ce r esa o pe r aci ón co n c ad e nas d e c a ract e res ). NU M ER O S EN T ER O S Si ut ili za mos 32 bits pa ra re p r ese nta r nú me ro ent e ros, dis p on em o s d e 2^32 c ombi nac io n es d i fe r ent es d e 0 y 1`s: 4294967 296 va l or es. C omo te n em os qu e r ep r es enta r núm e ro n egat i vos y e l c e ro: -2 147 483 6 48 a l +2 147 483 647 NU M ER O S R E A L ES . (+|-) mantisa x 2 e x p o n e n t e En l a not aci ó n d el pu nto fl ota nt e u n nú me r o r eal es tá r e p res e nta do p o r u na hil e ra d e 32 bits f o rma da p o r un a ma ntisa d e 24 bits seg uid a de un ex p on ent e de 8 bits. La bas e se f ij a com o 10. Ta nt o la m ant isa como el e x po ne nt e son ent e ro s bina r ios de co mp l em en to d obl e. Tipos de datos abstractos Un tipo de datos abstracto – TDA defi n e u na nu e va c las e de ob j eto o c onc e pt o qu e p ue de ma ne ja rs e co n i nd e pe nd enc ia de la est ruct u ra de datos p a ra r ep r es enta r lo . Pa r a e ll o es nec es ar io es pec if ica r: Las o p e rac io n es qu e s e pu ed e r ea li za r c on l os obj etos . El e fe cto q ue se p r odu c e a l a ctua r c o n l as o p e rac io n es so br e los mis mos. . U n TD A enc a psu la la d efi ni ci ón de l ti p o y t oda s l as o pe r aci on es c o n e ste ti p o. ESTRUCTURA DE DATOS I -- FCI Los l en gua j es de p ro gr amac ió n e ntr eg an al pr og ram ad or c ie rt os ti po s de dat o s básic os o pr imit i vos, e sp ecif ic and o e l co nj unt o de va lo r es q u e un a v ar iab le d e un o d e es os t i pos p u e de t om ar y el c on ju nto de o p e rac io n es r ea li z abl es s ob re los m ism os. P or e je mp l o, si s e dec l ar a e n C/ C++ unsigned int x, y; 6 Manual de Estructura de Datos
  • 8. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas La i nstr ucc ió n n = 9+10 de un p r og ram a d ond e = es el o pe ra do r d e asig nac ió n , el co nte ni do de la l oca l idad de al mac en ami e nt o da do p o r n ser á e l va l or 19. Cad a tip o d e datos : es rec on oc ido p or l os e l e ment os de d atos qu e p ued e tom a r y po r las o pe ra ci on es asoc ia das a é l. (su dom in io ) E jem p lo : en p asca l Dom ini o ent e r o D= {0, 1, 2….ma x } O pe r aci on es Los T D As so n ge n er al i zac io nes de los ti p os de dat os bás ic os y d e las o p e rac io nes p rim iti vas . U n TD A en caps ul a ti p os d e dat o s en el s e ntid o qu e e s pos ibl e p on e r l a def in ici ón de l ti p o y todas las o pe ra ci on es con es e ti p o e n u n a secc ió n d e u n p ro gr ama . P or ej em pl o, s e p ue de def in ir un ti p o de d ato s abstra cto C O NJ UNT O [ Ah o198 8] c on e l cua l se p u ed en d ef in i r l as sig ui ent es o pe r aci o nes: AN UL A ( A ) Hac e v ací o a l c on ju nto A UNI ON ( A, B, C ) Co nstr u y e el c o nju nt o C a p art i r d e la un ió n de los co nj unt os A y B. T A M AÑ O( A ) Ent r eg a l a ca nti dad de el em ent os d e l co nj unt o A. El co mp o ne nt e bás ico de una est r uctu ra de d atos es la c el da. La c eld a a lma ce na un v al or tom ad o d e a lgú n t i po d e dat o s im pl e o c o mpu est o El m eca nism o de ag r e gaci ón d e c el das ll am ado a r re gl o es una c o lec ci ón de el em ent os d e t ip o hom og én eo . A r re gl o b idim e nsi on al en C/ C++ int w[5][3] w[ i ] [j ] = b [ i * n + j] n es la c ant ida d d e col umn as d el a r re gl o ESTRUCTURADE DATOS I -- FCI w[ 2] [0 ] = b [6 ] Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 7
  • 9. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Estructuras de datos So n datos elementales aquellos que se consideran indivisibles en unidades más simples. Un a est ru ctu ra d e dat os es u na c las e de d atos qu e s e pu ed e ca ract e ri za r po r s u or ga ni zac ió n y o pe r aci on es d ef in idas s ob r e e lla . Al gun as v eces a es tas est ru ctu ras s e les ll ama ti pos d e dat o s. Los ti pos d e d atos más fr ec u ent es uti li z ados en los d if er e nt es l eng ua jes de p ro gr amac i ón s on : Lógicas de datos.- En un p r og ram a, c ada v a r iabl e p e rt en ec e a al gu na es t ruct u ra d e datos e xp líc ita o im p líc itam ent e d ef in ida, la c ual det e rmi na el c o nju nto d e op e rac i on e s va lid as pa ra e ll a. Primitivas y simples.- A qu e ll as q ue no está n com p uest as p o r ot r as est ruct u ras d e datos p o r ej em pl o, ent e ros, bo ol ea n os y ca r ac ter es. Lineales: pilas , c olas y listas li gad as l in ea l es. No lineales incluyen grafos y á rb ol es. Organización de archivos.- Las técnic as de estr uctu ra ci ón d e datos a pl ica das a con ju ntos de dat os qu e los s iste mas o p e rati v os ma n eja n c o mo ca jas ne g ras comú nm ent e s e lla ma n O rg a ni za c i ón de A rc h iv o s. CLASIFICACIÓN DE LAS ESTRUCTURAS DE DATOS Se clasifican en: a) Por su almacenamiento b) Por su organización c) Por su comportamiento a) Por su almacenamiento.- Se clasifican en: Internas Externas Internas.- Son aquellas cuyas estructuras se almacena en la memoria principal. Externas.- Son aquellas que se almacenan en las memorias secundarias de un sistema de computadoras. b) Por su organización.- Se clasifican en: Estáticas Dinámicas Estáticas.- son aquellas cuya agrupación de memoria no se disminuye o aumenta estas son: cadenas, conjuntos, escalares, entre otros. Dinámicas.- Son aquellas cuya agrupación de memoria pueden aumentar o disminuir durante la ejecución del programa, estas son: pila, colas, listas. ESTRUCTURA DE DATOS I -- FCI d) Por su comportamiento.- Se clasifican en: Simples Compuesto o Estructurados Simples.-Son aquellas que almacenan un valor y son: Enteros Escalares Real Lógicos Caracteres 8 Manual de Estructura de Datos
  • 10. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Compuesto.- Son aquellos que almacenan múltiples valores en su estructura y son los siguientes: Cadenas Arreglos Conjuntos Registros Listas Pilas Colas Árboles Archivos Base de datos Enteros Reales Clasificación de las estructuras de Datos Simples Caracteres Cadena Booleano Arreglo Estático Conjunto Registro Listas Estructurados Lineales Pilas Colas Dinámicos No Lineales Árboles Grafos Los ti pos d e dat os sim pl es pu ed en s er o rga ni zad os e n di fe r ent es est ruct u ras d e dat os : estát icas y di nám icas. ESTRUCTURADE DATOS I -- FCI Las estructuras de datos estáticas: So n a q ue ll as en las q ue el t ama ño oc u pad o en m em o ri a se d e fin e a ntes de q ue e l p ro gr ama se ej ecut e y n o pu ed e m od if ica rs e dic ho tam añ o d u rant e la e j ecuc ió n de l p ro gr ama . Est as est r uctu ras est á n im p le me ntad as en c a si tod o s los l en gua j es. Su pr inc i pa l c a ract e rís tica es qu e ocu p an so lo u na casi ll a de m em or ia, po r l o t ant o una v a ria bl e sim p l e h ace r ef e re nc ia a u n ú n ico v al o r a la v ez , d en tro de est e g r up o Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 9
  • 11. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas de d atos s e en cu ent ra : ent e ros , re al es, c a ract e res, bo lé an os, en um e r ados y s ub ra ng os (l os últi mos n o e x iste n en al gu nos l eng ua jes d e p rog r amac ió n ) Las estructuras de datos dinámicas: No ti en e n las lim itac io nes o r est ri cci on es en el ta ma ño d e m em or ia ocu p ada qu e s o n p ro p ias d e las est ruct u ras estát icas . M edi ant e el us o de u n ti p o d e dat os es pe cifi co, d en omi na do p u nte r o, es p osib l e const r ui r est ru ctu ras d e dat os di nám icas qu e no s on so p o rtad as p o r la ma y o ría d e l os le ngu aj es, p er o qu e en aq u el los q ue s i ti en en estas c ar act er ístic as o f r ece n so lu ci on es efi cac es y ef ect iv as en la s ol uci ón d e pr ob lem as co mp l ej os. Se c a ract e ri za po r el h ech o d e q ue c o n un n omb re s e ha ce r ef er e n cia a u n g ru p o de casi llas d e m emo r ia. E s dec i r u n dat o est ruct ur ad o ti en e va r ios com po n ent es. VARIABLES ESTRUCTURADAS O ARREGLOS CONJUNTO DE DATOS DEL MISMO DEL MISMO TIPO AGRUPADOS BAJO UN SOLO NOMBRE Pa r a r ef e ri r nos a un o de el los s e ha ce r ef er enc ia a la p osic ió n qu e oc u pa el d at o r esp ect o a los ot ros. Pu ed en s e r u ni dems io na les ( v ecto r es ) mu ltid ime nsi o nal es ( matr ic es ) Ej : vo ca l= {a, e,i ,o, u } La l ista d e c las e c o n n otas VECTORES A r re gl os u ni dim ens in al es: Ej em p lo: • Lista d e Cl ase • Co la p ar a c om p ra r ti ck est • Voca les d el abe ce da ri o . OPERACIONES CON VECTORES P ode mos hac e r c on un v ecto r: ESTRUCTURA DE DATOS I -- FCI • Lle na r • Most r ar • O rd en ar • Busc a r: • Se cu enc ia l • Bi na ri a 10 Manual de Estructura de Datos
  • 12. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Estructuras Supongamos que queremos hacer una agenda con los números de teléfono de nuestros amigos. Necesitaríamos un array de Cadenas para almacenar sus nombres, otro para sus apellidos y otro para sus números de teléfono. Esto puede hacer que el programa quede desordenado y difícil de seguir. Y aquí es donde vienen en nuestro auxilio las estructuras. Para definir una estructura usamos el siguiente formato: struct nombre_de_la_estructura { campos de estructura; }; NOTA: Es importante no olvidar el ';' del final, si no a veces se obtienen errores extraños. Para nuestro ejemplo podemos crear una estructura en la que almacenaremos los datos de cada persona. Vamos a crear una declaración de estructura llamada amigo: struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; char edad; }; A cada elemento de esta estructura (nombre, apellido, teléfono) se le llama campo o miembro. (NOTA: He declarado edad como char porque no conozco a nadie con más de 127 años. Ahora ya tenemos definida la estructura, pero aun no podemos usarla. Necesitamos declarar una variable con esa estructura. struct estructura_amigo amigo; Ahora la variable amigo es de tipo estructura_amigo. Para acceder al nombre de amigo usamos: amigo.nombre. Vamos a ver un ejemplo de aplicación de esta estructura. (NOTA: En el siguiente ejemplo los datos no se guardan en disco así que cuanda acaba la ejecución del programa se pierden). #include <stdio.h> struct estructura_amigo {/* Definimos la estructura estructura_amigo */ char nombre[30]; char apellido[40]; char telefono[10]; char edad; }; struct estructura_amigo amigo; void main() { ESTRUCTURADE DATOS I -- FCI printf( "Escribe el nombre del amigo: " ); fflush( stdout ); scanf( "%s", &amigo.nombre ); printf( "Escribe el apellido del amigo: " ); fflush( stdout ); scanf( "%s", &amigo.apellido ); printf( "Escribe el número de teléfono del amigo: " ); fflush( stdout ); scanf( "%s", &amigo.telefono ); printf( "El amigo %s %s tiene el número: %s.n", amigo.nombre, amigo.apellido, amigo.telefono ); } Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 11
  • 13. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Este ejemplo estaría mejor usando gets que scanf, ya que puede haber nombres compuestos que scanf no cogería por los espacios. Se podría haber declarado directamente la variable amigo: struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; } amigo; Arrays de estructuras Supongamos ahora que queremos guardar la información de varios amigos. Con una variable de estructura sólo podemos guardar los datos de uno. Para manejar los datos de más gente (al conjunto de todos los datos de cada persona se les llama REGISTRO) necesitamos declarar arrays de estructuras. ¿Cómo se hace esto? Siguiendo nuestro ejemplo vamos a crear un array de ELEMENTOS elementos: struct estructura_amigo amigo[ELEMENTOS]; Ahora necesitamos saber cómo acceder a cada elemento del array. La variable definida es amigo, por lo tanto para acceder al primer elemento usaremos amigo[0] y a su miembro nombre: amigo[0].nombre. Veamoslo en un ejemplo en el que se supone que tenemos que meter los datos de tres amigos: #include <stdio.h> #define ELEMENTOS 3 struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; int edad; }; struct estructura_amigo amigo[ELEMENTOS]; void main() { int num_amigo; for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ ) { printf( "nDatos del amigo número %i:n", num_amigo+1 ); printf( "Nombre: " ); fflush( stdout ); gets(amigo[num_amigo].nombre); printf( "Apellido: " ); fflush( stdout ); ESTRUCTURA DE DATOS I -- FCI gets(amigo[num_amigo].apellido); printf( "Teléfono: " ); fflush( stdout ); gets(amigo[num_amigo].telefono); printf( "Edad: " ); fflush( stdout ); scanf( "%i", &amigo[num_amigo].edad ); while(getchar()!='n'); } /* Ahora imprimimos sus datos */ for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ ) { printf( "El amigo %s ", amigo[num_amigo].nombre ); printf( "%s tiene ", amigo[num_amigo].apellido ); 12 Manual de Estructura de Datos
  • 14. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas printf( "%i años ", amigo[num_amigo].edad ); printf( "y su teléfono es el %s.n" , amigo[num_amigo].telefono ); } } IMPORTANTE: Quizás alguien se pregunte qué pinta la línea esa de while(getchar()!='n');. Esta línea se usa para vaciar el buffer de entrada. Para más información consulta Qué son los buffer y cómo funcionan. Inicializar una estructura A las estructuras se les pueden dar valores iniciales de manera análoga a como hacíamos con los arrays. Primero tenemos que definir la estructura y luego cuando declaramos una variable como estructura le damos el valor inicial que queramos. Recordemos que esto no es en absoluto necesario. Para la estructura que hemos definido antes sería por ejemplo: struct estructura_amigo amigo = { "Juanjo", "Lopez", "592-0483", 30 }; NOTA: En algunos compiladores es posible que se exiga poner antes de struct la palabra static. Por supuesto hemos de meter en cada campo el tipo de datos correcto. La definición de la estructura es: struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; int edad; }; por lo tanto el nombre ("Juanjo") debe ser una cadena de no más de 29 letras (recordemos que hay que reservar un espacio para el símbolo '0'), el apellido ("Lopez") una cadena de menos de 39, el teléfono una de 9 y la edad debe ser de tipo char. Vamos a ver la inicialización de estructuras en acción: #include <stdio.h> struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; int edad; ESTRUCTURADE DATOS I -- FCI }; struct estructura_amigo amigo = { "Juanjo", "Lopez", "592-0483", 30 }; int main() { printf( "%s tiene ", amigo.apellido ); printf( "%i años ", amigo.edad ); printf( "y su teléfono es el %s.n" , amigo.telefono ); Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 13
  • 15. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas } También se puede inicializar un array de estructuras de la forma siguiente: struct estructura_amigo amigo[] = { "Juanjo", "Lopez", "504-4342", 30, "Marcos", "Gamindez", "405-4823", 42, "Ana", "Martinez", "533-5694", 20 }; En este ejemplo cada línea es un registro. Como sucedía en los arrays si damos valores iniciales al array de estructuras no hace falta indicar cuántos elementos va a tener. En este caso la matriz tiene 3 elementos, que son los que le hemos pasado. Paso de estructuras a funciones Las estructuras se pueden pasar directamente a una función igual que hacíamos con las variables. Por supuesto en la definición de la función debemos indicar el tipo de argumento que usamos: int nombre_función ( struct nombre_de_la_estructura nombre_de_la variable_estructura ) En el ejemplo siguiente se usa una función llamada suma que calcula cual será la edad 20 años más tarde (simplemente suma 20 a la edad). Esta función toma como argumento la variable estructura arg_amigo. Cuando se ejecuta el programa llamamos a suma desde main y en esta variable se copia el contenido de la variable amigo. Esta función devuelve un valor entero (porque está declarada como int) y el valor que devuelve (mediante return) es la suma. #include <stdio.h> struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; int edad; }; ESTRUCTURA DE DATOS I -- FCI struct estructura_amigo amigo = { "Juanjo", "Lopez", "592-0483", 30 }; int suma( struct estructura_amigo arg_amigo ) { return arg_amigo.edad+20; } int main() 14 Manual de Estructura de Datos
  • 16. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas { printf( "%s tiene ", amigo.apellido ); printf( "%i años ", amigo.edad ); printf( "y dentro de 20 años tendrá %i.n", suma(amigo) ); } Si dentro de la función suma hubiésemos cambiado algún valor de la estructura, dado que es una copia no hubiera afectado a la variable amigo de main. Es decir, si dentro de 'suma' hacemos arg_amigo.edad = 20; el valor de arg_amigo cambiará, pero el de amigo seguirá siendo 30. También se pueden pasar estructuras mediante punteros o se puede pasar simplemente un miembro (o campo) de la estructura. Si usamos punteros para pasar estructuras como argumentos habrá que hacer unos cambios al código anterior (en negrita y subrrayado): int suma( struct estructura_amigo *arg_amigo ) { return arg_amigo->edad+20; } int main() { printf( "%s tiene ", amigo.apellido ); printf( "%i años ", amigo.edad ); printf( "y dentro de 20 años tendrá %i.n", suma(&amigo) ); } Lo primero será indicar a la función suma que lo que va a recibir es un puntero, para eso ponemos el * (asterisco). Segundo, como dentro de la función suma usamos un puntero a estructura y no una variable estructura debemos cambiar el '.' (punto) por el '->'. Tercero, dentro de main cuando llamamos a suma debemos pasar la dirección de amigo, no su valor, por lo tanto debemos poner '&' delante de amigo. Si usamos punteros a estructuras corremos el riesgo (o tenemos la ventaja, según cómo se mire) de poder cambiar los datos de la estructura de la variable amigo de main. Pasar sólo miembros de la estructura Otra posibilidad es no pasar toda la estructura a la función sino tan sólo los miembros que sean necesarios. Los ejemplos anteriores serían más correctos usando esta tercera opción, ya que sólo usamos el miembro 'edad': int suma( char edad ) { return edad+20; } ESTRUCTURADE DATOS I -- FCI int main() { printf( "%s tiene ", amigo.apellido ); printf( "%i años ", amigo.edad ); printf( "y dentro de 20 años tendrá %i.n", suma(amigo.edad) ); } Por supuesto a la función suma hay que indicarle que va a recibir una variable tipo char (amigo->edad es de tipo char). Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 15
  • 17. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Estructuras dentro de estructuras (Anidadas) Es posible crear estructuras que tengan como miembros otras estructuras. Esto tiene diversas utilidades, por ejemplo tener la estructura de datos más ordenada. Imaginemos la siguiente situación: una tienda de música quiere hacer un programa para el inventario de los discos, cintas y cd's que tienen. Para cada título quiere conocer las existencias en cada soporte (cinta, disco, cd), y los datos del proveedor (el que le vende ese disco). Podría pensar en una estructura así: struct inventario { char titulo[30]; char autor[40]; int existencias_discos; int existencias_cintas; int existencias_cd; char nombre_proveedor[40]; char telefono_proveedor[10]; char direccion_proveedor[100]; }; Sin embargo utilizando estructuras anidadas se podría hacer de esta otra forma más ordenada: struct estruc_existencias { int discos; int cintas; int cd; }; struct estruc_proveedor { char nombre[40]; char telefono[10]; char direccion[100]; }; struct estruc_inventario { char titulo[30]; char autor[40]; struct estruc_existencias existencias; struct estruc_proveedor proveedor; } inventario; Ahora para acceder al número de cd de cierto título usaríamos lo siguiente: inventario.existencias.cd y para acceder al nombre del proveedor: ESTRUCTURA DE DATOS I -- FCI inventario.proveedor.nombre 16 Manual de Estructura de Datos
  • 18. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Tipos de datos definidos por el usuario Typedef Ya conocemos los tipos de datos que nos ofrece C: char, int, float, double con sus variantes unsigned, arrays y punteros. Además tenemos las estructuras. Pero existe una forma de dar nombre a los tipos ya establecidos y a sus posibles variaciones: usando typedef. Con typedef podemos crear nombres para los tipos de datos ya existentes, ya sea por capricho o para mejorar la legibilidad o la portabilidad del programa. Por ejemplo, hay muchos programas que definen muchas variables del tipo unsigned char. Imaginemos un hipotético programa que dibuja una gráfica: unsigned char x0, y0; /* Coordenadas del punto origen */ unsigned char x1, y1; /* Coordenadas del punto final */ unsigned char x, y; /* Coordenadas de un punto genérico */ int F; /* valor de la función en el punto (x,y) */ int i; /* Esta la usamos como contador para los bucles */ La definición del tipo unsigned char aparte de ser larga no nos da información de para qué se usa la variable, sólo del tipo de dato que es. Para definir nuestros propios tipos de datos debemos usar typedef de la siguiente forma: typedef tipo_de_variable nombre_nuevo; En nuestro ejemplo podríamos hacer: typedef unsigned char COORD; typedef int CONTADOR; typedef int VALOR; y ahora quedaría: COORD x0, y0; /* punto origen */ ESTRUCTURADE DATOS I -- FCI COORD x1, y1; /* punto final */ COORD x, y; /* punto genérico */ VALOR F; /* valor de la función en el punto (x,y) */ CONTADOR i; Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 17
  • 19. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Ahora, nuestros nuevos tipos de datos, aparte de definir el tipo de variable nos dan información adicional de las variables. Sabemos que x0, y0, x1, y1, x, y son coordenadas y que i es un contador sin necesidad de indicarlo con un comentario. Realmente no estamos creando nuevos tipos de datos, lo que estamos haciendo es darles un nombre más cómodo para trabajar y con sentido para nosotros. Punteros También podemos definir tipos de punteros: int *p, *q; Podemos convertirlo en: typedef int *ENTERO; ENTERO p, q; Aquí p, q son punteros aunque no lleven el operador '*', puesto que ya lo lleva ENTERO incorporado. Arrays También podemos declarar tipos array. Esto puede resultar más cómodo para la gente que viene de BASIC o PASCAL, que estaban acostumbrados al tipo string en vez de char: typedef char STRING[255]; STRING nombre; donde nombre es realmente char nombre[255];. Estructuras También podemos definir tipos de estructuras. Antes, sin typedef: struct _complejo { double real; double imaginario; }; ESTRUCTURA DE DATOS I -- FCI struct _complejo numero; Con typedef: typedef struct { double real; double imaginario; } COMPLEJO; COMPLEJO numero; 18 Manual de Estructura de Datos
  • 20. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Asignación de Memoria Dinámica Métodos de Asignación de Memoria ¿Cuáles son los métodos de asignación de memoria utilizados por el S.O.? Cabe destacar que el almacenamiento y procesamiento de todos los datos es realizado en memoria RAM, en un segmento destinado a ello (DS), por ello, es importante conocer los métodos de asignación de memoria utilizados para su almacenamiento. Por un lado, se tiene la asignación estática de memoria en donde se reserva la cantidad necesaria para almacenar los datos de cada estructura en tiempo de compilación. Esto ocurre cuando el compilador convierte el código fuente (escrito en algún lenguaje de alto nivel) a código objeto y solicita al S.O. la cantidad de memoria necesaria para manejar las estructuras que el programador utilizó, quien según ciertos algoritmos de asignación de memoria, busca un bloque que satisfaga los requerimientos de su cliente. Por otro lado se tiene la asignación dinámica en donde la reserva de memoria se produce durante la ejecución del programa (tiempo de ejecución). Para ello, el lenguaje Pascal cuenta con dos procedimientos: NEW() y DISPOSE() quienes realizan llamadas al S.O. solicitándole un servicio en tiempos de ejecución. El procedimiento NEW ,por su parte, solicita reserva de un espacio de memoria y DISPOSE la liberación de la memoria reservada a través de una variable especial que direccionará el bloque asignado o liberado según sea el caso. Ejemplo : Cuando se compilan las sgtes. Líneas de código se produce una asignación estática de memoria: var linea: string [80]; (*Se solicita memoria para 80 caracteres --> 80 bytes) operatoria: Array[1..100,1..100] of real; (*Se solicita memoria para 100x100 reales -> 100 x 100 x 4 bytes) interes : integer; ESTRUCTURADE DATOS I -- FCI (*Se solicita memoria para 1 entero --> 2 bytes) ¿Cuántos bytes se reservarían para:? datos: array [1..25] of double; Para explicar con mayor detalle el concepto de memoria dinámica es necesario conocer el concepto ¡PUNTEROS! Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 19
  • 21. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Punteros Son tipos de datos simples capaces de almacenar la posición de una variable en memoria principal. Se dice que ellos direccionan a otras variables. Ejemplo: Se dice que las variables ubicadas en las posiciones 1003 y 1006 son punteros, pues direccionan o "apuntan a" las posiciones 1000 y 1007 respectivamente. Otra explicación.- Un pu nte r o es u n obj et o q ue a p unta a otr o ob jet o. Es d eci r, u na va ri abl e cu yo va lo r es la d i rec ci ón de mem o ri a d e ot ra va ri abl e. No h a y qu e c o nfu ndi r una di r ecc ió n d e m em or ia co n el co nte ni do d e esa d i re cci ón d e mem or ia . i nt x = 2 5; D i rec ci ón 15 02 1504 1 506 1508 La di r ecc ió n d e la va r ia ble x ( & x) es 1502 El co nt en ido d e l a va ri a ble x es 2 5 Las di rec ci on es de m e mo ria d e p end en d e l a ar q uit ectu r a de l o rd en ado r y de l a gest ió n qu e e l sist ema o p e rati v o h aga de e ll a. ESTRUCTURA DE DATOS I -- FCI En l en gua j e e nsam bla d or se deb e ind ica r num é ric ame nt e l a pos ici ón físic a d e m em or i a en qu e qu e re mos a lma cen a r un d ato. D e a hí qu e est e l en gu aj e de p end a tant o d e l a má qui na e n l a qu e s e a pl i qu e. En C n o d eb em os, n i p od emos , i nd ica r num é r icam ent e la di r ecc ió n de m em o ri a, s i n o qu e ut il iz amos una eti qu et a q ue c on oc em os com o va r iab le ( en su día d efi ni mos l as va r iab les com o di r ecci on es d e m em o ri a) . L o qu e n os i nte r esa es al mace na r un dat o, y no la l oca li zac ió n ex act a d e es e d ato e n m em o ri a. 20 Manual de Estructura de Datos
  • 22. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Un a v ar iab l e p unt e ro s e dec la r a com o tod as l as va r iab les. D eb e se r del m ismo t ip o qu e la va r iab le a pu ntad a. S u id e ntif ica do r va p r ec edi do de un ast e risc o ( *): i nt * p u nt; Es un a v ar iab l e pu nt er o q ue a pu nta a va ri ab le qu e c o nti en e un d a to d e ti po ent e ro lla mad a pu nt. ch a r *c ar: Es un p unt e ro a va ri abl e d e ti p o c ar áct er . l o ng f lo at *n um; f lo at * mat[ 5] ; // . . . Es d eci r: ha y ta ntos tip os d e p unt e ros c omo t ip os d e dat os, aun q u e tambi é n pu ed en de cla r ars e pu nt er os a estruct ur as más c om p le jas ( func i on es, st r uct , fich e ros ... ) e i ncl uso p u nte r os vac íos ( v oid ) y pu nt er os nu los (N ULL ). Dec la rac ió n d e v ar iab le s pu nt er o: S ea un f rag ment o d e p r og ram a e n C: cha r dat o; // v a riab l e q ue al mac en a rá un c a r ácte r. cha r * p unt; //d ec la r aci ón de p unt e ro a c ar ácte r. pu nt = & dat o; // e n l a va r iab le p unt gu ar dam o s la d i re cci ón // d e m em o ria d e l a va r iab le dat o; pu nt a p u nta // a d ato . Ambas so n del mism o t ip o, ch ar. int * p unt = N ULL, va r = 14; pu nt = & va r; p ri ntf (“ %# X, %# X ”, pu nt, & va r ) // la m ism a s ali da: di r ecci ón p ri ntf (“ n% d, %d ”, * pu nt, va r ); //sa lid a: 1 4, 14 H a y qu e t en e r c uid ad o c on las di r ecci on es a pu ntad as: p ri ntf (“ %d, %d ”, * ( pu n t+1), v a r+1 ); *( pu nt + 1 ) r e pes e nta el v al o r co nt en ida e n la d i rec ci ón de m em o ri a a um enta da en una p osi ci ón ( int=2 by tes) , qu e s e rá un v al or n o d ese ad o. Si n emb ar go v ar +1 r ep r es enta e l va lo r 15. pu nt + 1 r e p r ese nta l o m ism o qu e &v a r + 1 ( a van ce en la d ir ecc i ón d e m em o ria d e va r ). Al tr aba ja r c on p unt e r o s se em pl ea n d os o pe r ado r es esp ec íf icos : ESTRUCTURADE DATOS I -- FCI O pe r ado r d e d i r ecci ón : & R e p r ese nta la di r ecc ió n de m em o ri a de la va r iab le qu e l e sig u e: &fn um r e p res en ta la di r ecc ió n d e f num . O p er ad o r d e c o nte nid o o i nd ir ecc i ón: * El o p er ad o r * a pl ic ado al nomb r e d e u n pu nt er o i nd ica el va l or de la va r iab le ap unt ada: flo at alt ur a = 2 6.92, *ap unt a; Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 21
  • 23. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas ap unt a = &a ltu r a; // in i cia li zac ió n d el p unt e ro flo at alt ur a = 2 6.92, * ap unt a; ap unt a = &a ltu r a; // in i cia li zac ió n d el p unt e ro .p ri ntf ( “n %f ”, a ltu r a) ; //sa li da 2 6.92 .p ri ntf ( “n %f ”, * a punt a ); No s e d eb e co nf und i r e l o p e rad o r * en l a d ecl ar aci ón de l pu nt er o: int * p; Co n el o pe r ad or * en la s inst ru cci on es: * p = 27; p ri ntf ( “ n Co nte ni do = %d ”, *p ); Veam os c on u n e j em pl o en C la dif e r enc ia e ntr e to dos est os c onc e pt o s Veam os el a rch i vo - p unt0 .c pp - p unt1 .c pp Es d ec i r: int x = 25, *p int; pi nt = & x; La va ri abl e p int c onti e ne l a d ir ecc ió n de m em or ia d e la v ar iab l e x. L a ex p r esi ón: * pi nt r ep r es enta el va lo r de la v a riab l e ( x) a p unt ad a, es dec i r 25. La v a ri abl e p int tamb ié n tie ne su p ro p ia di r ecci ó n: & pi nt Veam os c on ot r o ej em p lo e n C la di fe r enc ia e n tre tod os est os c onc e pt os vo id mai n ( vo id ) { int a, b, c , * p1, *p 2; vo id *p ; p1 = & a; // P aso 1. La di r ecci ó n d e a es asig nad a a p 1 *p1 = 1; // P as o 2. p1 (a ) es i gu al a 1. E qu i va le a a = 1; p2 = & b; / / Pas o 3. La d i re cci ón de b es asig nad a a p2 *p2 = 2; // P aso 4. p 2 (b) es ig ua l a 2. E qu i va le a b = 2; ESTRUCTURA DE DATOS I -- FCI p1 = p 2; // Pas o 5. El va l or de l p1 = p2 *p1 = 0; // P aso 6. b = 0 p2 = & c; / / Pas o 7 . La d i rec ci ón de c es a sign ada a p2 *p2 = 3; // Pas o 8 . c = 3 p ri ntf (" %d % d %d n ", a, b, c ); / / Pas o 9. ¿Q u é se im p rim e ? p = p1 ; / / Pas o 1 0. p co nti e ne la di r ecci ón de p1 p = p2 ; // Pas o 11. p1= p2; 22 Manual de Estructura de Datos
  • 24. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas *p1 = 1; / / Pas o 12. c = 1 p ri ntf (" %d % d %d n ", a, b, c ); // Pas o 13 . ¿ Qu é s e i mp r im e? } Vamos a h ac er un se g uim ie nto de las di r ecc i on es d e m em o ria y de los v al or es d e las va r iab les e n cad a pas o. Su p on em os qu e l a va r iab le a es co lo cad a e n l a di r ecc ió n 0000, b e n l a sig ui e n te, es d eci r 0 002, co n u n o ffs et d e 2 b yt e s, p o r se r v al o res int eg er . Se t rat a d e un sist em a de pos ici o nes re lat i va s de mem o ri a. S e v e rá e n ar itm étic a d e pu nt er os. Se obti en e e l s igu i ent e cu ad ro. En él r ef l eja m os las di r ecci o nes re lat iv as d e me mo r ia y los c amb ios e n ca da un o d e l os pas os m a rcad o s: Inic ia li zac ió n d e pu nt er os( I) : Si < Alm ac en ami ent o> es e xte r n o stat ic, <E x p res io n> deb e rá s e r u na e x p res ió n ESTRUCTURADE DATOS I -- FCI const ant e d el ti p o < Ti p o> ex p r esad o. Si < Al mac en ami e nto> es aut o, ent on ces < E x p res io n> p u ed e s er cu al qu i er e x p res i ón del < Ti p o> esp ec if icad o. Ej em p los: 1) La co nstant e ent e ra 0, NULL (c er o ) p r o po rc io n a un pu nte r o nu l o a cu al qu i er ti p o de d ato: int *p; Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 23
  • 25. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas p = NUL L; // actu al iz aci ó n 2) El no mb re d e un a r ra y d e a lma ce nam i ent o stati c o ext e rn s e t r ansf o rma s eg ún la ex p r esi ón: a ) f l oat m at [12 ]; fl oat * p unt = mat; b) fl o at mat [12 ]; f lo at * p unt = & mat [0 ]; 3) U n “ cast ” pu nt er o a pu nt er o: int *p unt = ( int *) 123. 456; Inic ia li za e l pu nte r o c o n e l ent e ro . 4) U n punt e r o a ca ráct e r pu ed e i nic ia li za rs e e n l a f or ma: cha r *c ad en a = Est o e s un a cad e na ”; 5) S e p u ede n suma r o r esta r v al o res e nt er os a las dir ecc io n es de m e mo ria en l a fo rma : (a rit mét ica de p unt e r os) st atic int x; int * pu nt = & x+2, *p = & x-1; 6) E qu i va le nci a: D os ti pos de fi nid os c omo p u nte r os a o bj eto P y pu n ter o a obj et o Q so n e qu iv al e ntes s ó lo s i P y Q s on de l m ism o ti p o. A pl ica do a m atr ic es: nomb r e_ pu nte r o = nom br e_m atr i z; ESTRUCTURA DE DATOS I -- FCI 24 Manual de Estructura de Datos
  • 26. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas PUNTEROS Y ARRAYS Se a el a rr a y d e una di mens ió n: i nt mat [ ] = { 2, 16 , - 4, 29, 234, 1 2, 0, 3 }; en e l qu e c ada e le me nt o, po r s e r t ip o int, oc u p a dos b ytes de me mo ri a. Su p on em os qu e la di re cció n d e m em o ri a d el p rim e r el em ent o, es 1 50 0: & mat [0 ] es 1 500 & mat [1 ] s er á 1502 & mat [7 ] s er á 1514 int mat [ ] = {2 , 16, -4 , 29, 2 34, 12 , 0, 3} ; En tot al los 8 el em ent o s ocu p an 16 b yt es. P ode mos r e p res ent a r l as di r ecci o nes de mem or ia q u e oc u pa n l os el e ment os d e l a r ra y , los dat os qu e c ont ie n e y las p osic io n es d el a rr ay e n l a f o rma: Di rec ci ón 1 500 1 502 1 504 1506 1 508 1510 151 2 1514 El em e nto mat [0 ] mat [1 ] mat [2 ] mat [3 ] mat [4 ] mat [5 ] mat [6 ] m at[ 7] El acc es o po dem os hac e rl o m edi ant e el ín dic e: x = mat [3 ]+m a t[5 ]; // x = 2 9 + 1 2 pa ra sum ar l os el em ent os d e l a c ua rta y s e xta pos ic io nes . C om o h em os d ich o q ue p od em os acc ede r p or pos ici ón y p or di r ec ció n: ¿ Es lo mism o &mat [0 ] y mat? Y &mat [1 ] = mat ++ ? Veam os el có dig o d e un ej em p lo: #inc lu de <stdi o.h > #inc lu de <co ni o.h > int m at[ 5] ={ 2, 16 , -4, 2 9, 234, 12, 0 , 3 }, i; // d ecl a rad as c omo gl oba l e s vo id mai n () { p ri ntf (" n% d", &mat [0 ] ); // res ult ad o: 15 00 ( di r ecci ón d e m em ) ESTRUCTURADE DATOS I -- FCI p ri ntf (" n% p ", m at ); / /r es ulta do: 1 500 ( " " " " " ) i ++; //i =1 p ri ntf (" n% p ", m at+ i); // r esu ltad o: 1 502 ( " " " " " ) p ri ntf (" n% d", * (ma t+i) ); // r esu ltad o: 16 ( va lo r de mat [1 ] o val o r g etch ( ); } Ej em p lo Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 25
  • 27. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Pa r ec e d edu ci rs e qu e a cced em os a l os e l em en tos d el a rr a y d e d os f o r mas: - m ed iant e e l sub índ ice. - m ed iant e s u d ir ecc ió n d e m em or ia. El em e nto mat[ 0] mat [1 ] mat [2 ] m at[ 3] mat [4 ] mat [ 5] mat [6 ] m at[ 7] Analizando las direcciones de memoria del array: De lo ant e ri o r s e obt i en en v ar ias co ncl usi on es: - Es lo mism o &m at[ 0] q ue mat, & mat [2 ] q ue mat + 2 - Pa r a pasa r de un e l em ent o a l si gu ie nte , es lo mism o: Qu e el có dig o: ESTRUCTURA DE DATOS I -- FCI A esta fo rm a d e d es pl a za rs e e n m em o ria se l e ll ama 26 Manual de Estructura de Datos
  • 28. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Aritmética de punteros - A un a va ri abl e pu nt er o se l e p ue de asi gna r la dir ec ci ón d e cua l qu i er obj eto . - A un a v ar iab l e pu nt er o se le pu ed e asi gna r l a dir ec ci ón d e otr a v ar ia ble pu nte r o (si em p re qu e l as d os s eñ al en e l m ismo ob jet o ) - A un p unt e ro s e le p u e de in ici al iz ar co n el v al or N ULL - Un a v a riab l e p unt e ro pu ed e se r rest ada o com pa ra da c on ot ra si amba s ap unt an a el em ent os d e u n m ismo a r ra y. - Se p ue de s uma r o rest ar va l or es ent e ros : p + +, p v+3 , te ni en do e n c ue nta qu e el des pl az ami e nto ( offs et ) de p end e d e l ti p o d e d a to a pu nta do: p++; // p a pu nta a l a sigu ie nt e di r ecc ió n p v+=3 // p v a p unta 3* nº b ytes de l d ato a pu nt ado ( of fset) Si t e nem os: flo at *d ec ima l; / /su po nem os q ue a pu nta a 0 000 dec ima l++; //a p un ta a 0 004 - Obs e rv a r l as si gui e ntes inst ru cci on es: i nt * p; d oub l e * q; ESTRUCTURADE DATOS I -- FCI v oid *r ; // p un ter o ge né r ic o p = & 34; / / l a s const ant es no t i en en dir ec ci ón p = & ( i+1 ); / / las ex p r esi on es no ti en en di r ecci ón &i = p; // l as d ir ecc io n es n o s e pu ed e n camb ia r p = q; // il e gal p = ( int *) q; // l ega l Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 27
  • 29. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Uti li za nd o la aritmética de punteros nos despl az am os de u nas p osic io n es de mem or ia a ot r as. Pe r o. ¿c óm o ac ce de r a l os co nt en idos de es a s pos ic io nes util iz an do n otac ió n d e pu nt er os? Em p le amos el o pe ra do r *, indirección que n os da e l co nt en ido d e la di r ecci ón d e mem or ia a pu ntad a. Y... ¿c óm o s e a pl ica la a rit mét ica d e pu nte r os pa r a d es pl az ar nos e n un a r ra y bidim e nsi on al ?: f lo a t mat[ 2] [4 ]; //d ecl a rac ió n d e l a r ra y Uti li za nd o pu nte r os, la dec la rac ió n s e rá: fl o at ( *mat ) [4 ]; / /a r ra y b idim e nsi on al En d ond e mat es u n p unt e ro a u n g r up o co ntig u o d e a r r a ys mon od ime nsi o nal es ( ve cto r es) d e 4 el em en tos ca da un o. E xist e, p or tant o un a e qu i va le nci a: Rec o rd emos que *mat r ep r es enta un puntero a la primera fila. A la se gund a fil a n os r ef e ri mos m e dia nte *(m at+1 )+j p a ra las dir ec ci on es y con ESTRUCTURA DE DATOS I -- FCI *(* (m at+1 )+j ) p ar a los cont en id os. El segu nd o subíndi ce actua sob re la co lu mna . Si en x[ 10 ][ 20 ] q u ie r o acc ed e r al e le me nto d e l a fi la 3 y la c ol umn a 6, l o h ag o esc rib ie nd o x [2 ][ 5]. C o n n otac ió n d e p unt e ros , es e qu i va le nte a * ( * ( x + 2 ) +5 ) 28 Manual de Estructura de Datos
  • 30. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas ya qu e x + 2 es un pu nt er o a l a fi la 3. P or t ant o. E l co nt en ido de dich o pu nte r o, *( x+2 ), es la fi la 3. Si m e d esp la z o 5 p os ici on es e n es a fi la l l e go a l a p osi ci ón *( x+2 )+5, cu y o c ont en i do es * (* ( x+2 )+5 ). V e r dibu jo: Si en x[ 10 ][ 20 ] q u ie r o acc ed e r al e le me nto d e l a fi la 3 y la c ol umn a 6, l o h ag o esc rib ie nd o x [2 ] [5 ]. C on n otac ió n de punt e r os, lo qu e hac em os es co nsid e ra r qu e es un a r ra y fo rm ad o p o r 10 ar ra ys u ni dim ens i o nal es (v ect o res ) d e 2 0 el em ent os cad a un o, d e m od o qu e acc e do a x [2 ] [5 ] m ed iant e l a e x p res ió n: * ( * ( x + 2 ) + 5) ya qu e x + 2 es un pu nt er o a l a fi la 3. P or t ant o. E l co nt en ido de dich o pu nte r o, *( x+2 ), es la fi la 3. Si m e d esp la z o 5 p os ici on es e n es a fi la l l e go a l a p osi ci ón *( x+2 )+5, cu y o c ont en i do es * (* (x +2 )+5 ). L as sigu ie nt es e x p res io n es con p unt e ros s o n vá lid as: **x x [0 ] [0 ] ; *( *( x+1 ) ) x [1 ] [0 ] *(* x+1 ) x [0 ] [1 ]; ** (x +1 ) x [1] [0 ] Si e n int a rr a y[ fi las ] [c ol umn as] ; Qu i er o acc ed e r a l el e ment o a r ra y [ y ][ z ] p a ra asign a rl e un va l or , lo qu e e l com p il ad or hac e es : *(*array +columnas x y + z)) = 129; / /asig nac ió n Si f ue r a int a r ra y [2 ] [5 ] y q uisi e ra as ig na r 12 9 al e le me nto d e l a fi l a 1 y co lu mna 2 , po nd rí a: ESTRUCTURADE DATOS I -- FCI * (a r ra y + 5x1 + 1 )) = 129 ; es d eci r, des de e l or ig e n d el ar r a y a va n za 6 po sici on es d e m em o ri a: Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 29
  • 31. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas PUNTEROS A ARRAYS MATRICES Un a r ra y m ult idim e nsi on al es, en r e ali dad, una co l ecci ón d e vect or es. S eg ún est o, po de mos d ef in ir un ar ra y b idi me nsi on al c o mo u n p unt e r o a u n g ru p o co nti gu o d e ar ra ys un id ime nsi o nal e s. Las d ec la rac io n es si gui ent es s on e q ui va l en tes: int dat [fi l ] [co l ] i nt (*d at) [c ol ] En g en e ra l: tip o_d ato no mb re [d im1 ] [dim 2] . . . . . [di mp ]; e q ui va le a: tip o_d ato (* no mb re ) [di m2] [d im3 ]. . . . . [d im p ]; El a r ra y: i nt va l or [ x ][ y ] [z ]; Pu ed e s e r re p r ese nta d o en la fo rm a: i nt (* va lo r ) [y ] [ z] ; O c om o u n AR R A Y D E P UN T ER O S: int * v al or [ x ][ y ]; s in p a r ént esis En su nu e va dec la r aci ó n d esa pa r ec e l a ú ltim a de s us di me nsi on es. Veam os m ás d ecl a rac io nes de a rr a ys d e p unt e ros : ESTRUCTURA DE DATOS I -- FCI int x [10 ] [20 ]; int * x[ 10 ]; flo at p [10 ] [20 ] [30 ]; int * p[ 10 ][ 20 ]; 30 Manual de Estructura de Datos
  • 32. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Punteros a CADENAS DE CARACTERES Un a c ad ena d e c ar act e r es es u n ar r ay d e c ar a cte res . La f or ma de d e fin i r u n pu nt er o a una cad e na d e c a ract e r es: c ha r *ca de na; El id ent if icad o r d el ar ra y es l a di r ecc ió n d e comi e nz o d el a rr a y. Pa r a sab e r dó nd e ter mi na la c ad en a, el c om pi lad o r a ñad e el ca r ácte r ‘ 0’ ( A SCI I 0, N UL L): cha r * nomb r e = “ P E P E P ER E Z ”; ARRAYS DE PUNTEROS A CADENAS DE CARACTERES En un a r ra y d e pu nte r o s a cade nas d e ca r acte r es cad a el em e nto a p u nta a u n ca ráct e r. La d ecl a rac ió n s er á: cha r *c ad [10 ]; // po r e jem p lo Grá fic am ent e p od ría se r: ESTRUCTURADE DATOS I -- FCI - si l as di me nsi on es no son c o noc idas , sab r em os d ónd e c om ie n zan l a s cad en as, p er o no d ó nde t e rm ina n. Pa ra el l o se ef ect úa la l la mad a reserva dinámica de memoria (funci o nes ma ll oc, c al loc ( ), r ea ll oc ( ) y fr e e () de stdl ib.h ó al l oc.h ): cha r c ad[ 10 ][ 80 ]; E qu i va le a ch ar **ca d r es er v and o 8 00 b yt es Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 31
  • 33. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas La d ecl a rac ió n: c ha r ca d[10 ] [80 ]; Res e rv a me mo ri a p ar a 10 cade nas de c ar ac ter es d e80 ca ra cte r es cada un a. P er o en l a d ecl ar ac ió n com o a r ra y d e p unt e ros : c ha r * cad [10 ]; El co mp il ad or d esco n oc e el t ama ño de l as cad en as: ¿ cuá nta me mo ri a r ese r va ? - si e l a r ra y es stat ic y s e i nic ia li za n l as c ade nas e n e l p ro pi o códi go , e l com pi lad o r c alc ul a l a d ime nsi ón n o ex p lic itad a (a r ra ys s in dim e nsi ón ex p líc ita ). OTRAS CLASES DE PUNTEROS: P unt e ros ge n ér ic os: S on t i po v oi d: v oid *g en e ric o; Los p unt e r os ti po v oid pu ed en a pu nta r a ot r o tip o d e dat os. Es un a op e rac ió n del ica da q u e d e pe nd e d el ti p o d e c om pi la do r. Es c o nv e ni ent e em pl ea r e l “cast in g” pa ra l a c on v e rsi ón. Aú n as í, n o tod a s las c on v e rsi on es están p er miti das. P unt e ro nu lo: En C u n pu nte r o qu e a pu nte a un o bj et o vá li do n un ca tend rá un va lo r ce r o. E l va lo r c e r o s e ut il iz a pa ra i ndic a r qu e ha oc ur r id o a lgú n e r r or (e s dec ir , qu e a lg un a o p e ra ció n n o s e h a po did o r e ali za r ) int * p = N UL L; // int * p =0; Pu nte r os c onst ant es : U na d ec la ra ci ón de p u nte r o pr ec ed ida de co n st hac e qu e e l ob j eto a pu ntad o sea un a c onst ant e (a u nq u e n o el p unt e ro ): co nst ch a r * p = “V al lad ol id ”; p [0 ] = ‘f’ // e r ro r. La c ad ena a pu nta da po r + es cte . p = “ Puc el a ” //Ok . p a p unta a ot ra cade na . Si l o qu e qu e r emos es dec la ra r un p unt e ro co nstant e; cha r *co nst p = “ M edi na ”; p [0 ] = ‘s’; // e rr o r: el ob jet o “ Me di n a”, es cte. ESTRUCTURA DE DATOS I -- FCI p = “ P eñ af ie l ”; //e r ro r: e l pu nte r o p e s const ant e. Punt e r os a p unt e ros: Ve r ej em p4.c p p, ej e mp11 .c pp y ej em p12.c p p int ** pu nte r o; // pu nt er o a punt e r o a un obj eto i nt. El ti p o de ob jet o a pu ntad o des pu és d e un a dobl e in d i re cci ón pu e de se r de cua lq ui e r c las e. 32 Manual de Estructura de Datos
  • 34. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas P er mit e ma ne ja r a r ra ys d e mú lti p les d im e nsi on es c on n otac io ne s d el t i p o ***mat, d e múlt i pl e ind i re cci ón q ue pu ed en g en e ra r p r obl e mas si el trat ami ent o no es el adec ua do. O j o a los “ p unt er os lo cos ”. Punt e r os a dat os c o mp le jos: S e pu ed en d ecl a ra pu nte r os a d at os de fi nid os po r e l us ua ri o (t y pe de f( ) ), a dat os st ruct, a fun ci on es, c om o a rg u ment os d e func i on es... Dec la rac io n es c om pl ej as: U na d ec la rac ió n c om pl ej a es un id ent ifi cad o r con más d e d e u n op e r ado r. P ar a int er p r eta r estas d ecl a rac io nes hac e f a lta sab e r qu e los c o r chet es y pa r ént esis (o p e rad o r es a la de r ech a de l ide n tific ad or ti en e n p ri or i dad sob re los aste ris cos (o p e ra do res a l a iz q ui e rda d el id e ntif ica do r. L os p ar ént es is y co rch etes ti en e n l a m i sma p ri or id ad y s e e va lúa n d e i z qui e rd a a d e r echa . A la iz q ui er da de l t od o el t ip o d e dat o. Em pl e and o p ar é ntes is s e pu ed e cambi ar el or de n d e p ri o ri dad es. Las e x pr esi o nes ent r e pa r ént esis s e e v al úan p rim e ro , de más i nte r nas a más e xt e rnas . Pa r a i nte r p r eta r d ecl a r aci on es c om pl ej as p od em os se gu ir e l or de n: 1) Em p ez ar c on e l i dent if icad o r y ve r si haci a la d er ec ha ha y co rch etes o pa r ént esis . 2) I nte r p r eta r es os c or ch etes o p ar é ntes is y v e r si ha cia la i z q ui er da h ay aste risc os. 3 ) D ent ro de cad a ni v el d e pa r ént esis , d e más int e rn os a má s ext e rn os, ap lic a r pu ntos 1 y 2. Veam os un ej em p lo: cha r *(* (* va r ) ( ) )[ 10 ] La i nte r p r etac ió n es: 1. La v ar iab l e va r es d e cla rad a c om o 2. u n punt e r o a 3. u na f un ci ón q ue d ev ue l ve 4. u n punt e r o a ESTRUCTURADE DATOS I -- FCI 5. u n a r ra y d e 1 0 el em ent os, los cua l es so n 6. p unt e ros a 7. ob jet os d e t i po cha r. Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 33
  • 35. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Punteros a estructuras Cómo no, también se pueden usar punteros con estructuras. Vamos a ver como funciona esto de los punteros con estructuras. Primero de todo hay que definir la estructura de igual forma que hacíamos antes. La diferencia está en que al declara la variable de tipo estructura debemos ponerle el operador '*' para indicarle que es un puntero. Creo que es importante recordar que un puntero no debe apuntar a un lugar cualquiera, debemos darle una dirección válida donde apuntar. No podemos por ejemplo crear un puntero a estructura y meter los datos directamente mediante ese puntero, no sabemos dónde apunta el puntero y los datos se almacenarían en un lugar cualquiera. Y para comprender cómo funcionan, nada mejor que un ejemplo. Este programa utiliza un puntero para acceder a la información de la estructura: #include <stdio.h> struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; int edad; }; struct estructura_amigo amigo = { "Juanjo", "Lopez", "592-0483", 30 }; struct estructura_amigo *p_amigo; int main() { p_amigo = &amigo; printf( "%s tiene ", p_amigo->apellido ); printf( "%i años ", p_amigo->edad ); printf( "y su teléfono es el %s.n" , p_amigo->telefono ); } Has la definición del puntero p_amigo vemos que todo era igual que antes. p_amigo es un puntero a la estructura estructura_amigo. Dado que es un puntero tenemos que indicarle dónde debe apuntar, en este caso vamos a hacer que apunte a la variable amigo: p_amigo = &amigo; No debemos olvidar el operador & que significa 'dame la dirección donde está almacenado...'. ESTRUCTURA DE DATOS I -- FCI Ahora queremos acceder a cada campo de la estructura. Antes lo hacíamos usando el operador '.', pero, como muestra el ejemplo, si se trabaja con punteros se debe usar el operador '->'. Este operador viene a significar algo así como: "dame acceso al miembro ... del puntero ...". Ya sólo nos queda saber cómo podemos utilizar los punteros para introducir datos en las estructuras. Lo vamos a ver un ejemplo: #include <stdio.h> struct estructura_amigo { char nombre[30]; 34 Manual de Estructura de Datos
  • 36. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas char apellido[40]; int edad; }; struct estructura_amigo amigo, *p_amigo; void main() { p_amigo = &amigo; /* Introducimos los datos mediante punteros */ printf("Nombre: ");fflush(stdout); gets(p_amigo->nombre); printf("Apellido: ");fflush(stdout); gets(p_amigo->apellido); printf("Edad: ");fflush(stdout); scanf( "%i", &p_amigo->edad ); /* Mostramos los datos */ printf( "El amigo %s ", p_amigo->nombre ); printf( "%s tiene ", p_amigo->apellido ); printf( "%i años.n", p_amigo->edad ); } NOTA: p_amigo es un puntero que apunta a la estructura amigo. Sin embargo p_amigo->edad es una variable de tipo int. Por eso al usar el scanf tenemos que poner el &. ESTRUCTURADE DATOS I -- FCI Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 35
  • 37. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas Punteros a Arrays de estructuras Por supuesto también podemos usar punteros con arrays de estructuras. La forma de trabajar es la misma, lo único que tenemos que hacer es asegurarnos que el puntero inicialmente apunte al primer elemento, luego saltar al siguiente hasta llegar al último. #include <stdio.h> #define ELEMENTOS 3 struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; int edad; }; struct estructura_amigo amigo[] = { "Juanjo", "Lopez", "504-4342", 30, "Marcos", "Gamindez", "405-4823", 42, "Ana", "Martinez", "533-5694", 20 }; struct estructura_amigo *p_amigo; void main() { int num_amigo; p_amigo = amigo; /* apuntamos al primer elemento del array */ /* Ahora imprimimos sus datos */ for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ ) { printf( "El amigo %s ", p_amigo->nombre ); printf( "%s tiene ", p_amigo->apellido ); printf( "%i años ", p_amigo->edad ); printf( "y su teléfono es el %s.n" , p_amigo->telefono ); /* y ahora saltamos al siguiente elemento */ p_amigo++; } } En vez de p_amigo = amigo; se podía usar la forma p_amigo = &amigo[0];, es decir que apunte al primer elemento (el elemento 0) del array. La primera forma creo que es más usada pero la segunda quizás indica más claramente al lector principiante lo que se pretende. Ahora veamos el ejemplo anterior de cómo introducir datos en un array de estructuras mediante punteros: ESTRUCTURA DE DATOS I -- FCI #include <stdio.h> #define ELEMENTOS 3 struct estructura_amigo { char nombre[30]; char apellido[40]; int edad; }; struct estructura_amigo amigo[ELEMENTOS], *p_amigo; void main() 36 Manual de Estructura de Datos
  • 38. Universidad Tecnica de Manabí Facultad de Ciencias Informaticas { int num_amigo; /* apuntamos al primer elemento */ p_amigo = amigo; /* Introducimos los datos mediante punteros */ for ( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ ) { printf("Datos amigo %in",num_amigo); printf("Nombre: ");fflush(stdout); gets(p_amigo->nombre); printf("Apellido: ");fflush(stdout); gets(p_amigo->apellido); printf("Edad: ");fflush(stdout); scanf( "%i", &p_amigo->edad ); /* vaciamos el buffer de entrada */ while(getchar()!='n'); /* saltamos al siguiente elemento */ p_amigo++; } /* Ahora imprimimos sus datos */ p_amigo = amigo; for( num_amigo=0; num_amigo<ELEMENTOS; num_amigo++ ) { printf( "El amigo %s ", p_amigo->nombre ); printf( "%s tiene ", p_amigo->apellido ); printf( "%i años.n", p_amigo->edad ); p_amigo++; } } Es importante no olvidar que al terminar el primer bucle for el puntero p_amigo apunta al último elemento del array de estructuras. Para mostrar los datos tenemos que hacer que vuelva a apuntar al primer elemento y por eso usamos de nuevo p_amigo=amigo; (en negrita). ESTRUCTURADE DATOS I -- FCI Elaborado por: Ing. Esthela San Andres e Ing. Christian Torres 37