Vous êtes sur la page 1sur 72

LENGUAGE DE PROGRAMACION II UNIDAD I

1.1.- Sistemas de Informacin. Los sistemas que el analista disea da a da, la tecnologa, las personas, que utilizan el mayor uso de ella, y la cantidad de usuarios cada vez mayor van alterando el diseo que el analista realiza, no por ello este deja de ser importante, ya que el trabajo que este realiza se le est entregando grandes confiabilidades. Los sistemas de informacin a travs de su papel central en la economa, estn llevando a cabo los cambios en cuatro aspectos fundamentales: 1. 2. 3. 4. Las personas trabajan de manera ms inteligente. Cambio global en el concepto de industria. Tanto las ideas como la informacin estan tomando mas importancia que el dinero. Las personas que trabajan con la informacin dominan la fuerza del trabajo.

Trabajo mas Inteligente. La tecnologa se utiliza de muchas maneras: visibles e invisibles, espectaculares o rutinarias. Las computadoras y los sistemas de informacin ocupan ahora un sitio especial en las empresas donde facilitan la operacin eficiente. Los sistemas proporcionan informacin tanto de problemas como de oportunidades. Mas que desarrollar un nuevo producto, es posible simularlo con el consiguiente ahorro de tiempo, dinero y errores. Fusin Global de Empresas. En la actualidad, mediante el uso de sistemas de informacin diseados de manera cuidadosa, los bancos manejan transacciones que involucran dinero, acciones, seguros y propiedades. Las lineas que separan las industrias continuarn desapareciendo o fusionndose y el contenido de informacin en servicios y productos, sern las caractersticas distintivas de la industria. Ideas y Formacin. Los recursos bsicos, son las ideas y el uso de informacin. El empleo estratgico de la informacin continuaran creando, virtualmente en todas las industrias, nuevas oportunidades. Las habilidades para hacer uso de la informacin, mas que los recursos financieros, para tener ventajas. Aumentar la confiabilidad en la informacin tendr una responsabilidad cada vez mayor. Un sistema debe funcionar de manera apropiada, ser fcil de utilizar y adecuarse a la organizacin para la que fue diseado. Panorama del Anlisis y Diseo de Sistemas. Antes de realizar un diseo de anlisis de sistemas el analista debe anticipar todo un flujo de informacin y motivos que hacen que se requiera un cambio de operacin de cualquier empresa, esta acumulacin de informacin se denomina estudio de sistemas, es la que precede a todas las dems actividades del anlisis. El Trabajo del Analista de Sistemas. Las funciones asignadas a los analistas son:

1. Analisis de sistema: Son responsables de detectar hechos relevantes relacionados con la actividad de la empresa y la funcin es reunir informacin y determinar los requerimientos. 2. Analisis y diseo de sistemas: Otra responzabilidad es disear el nuevo sistema. Son responsables del anlisis como del diseo. Responsabilidad al Programar Computadoras. El analista ms valioso y mejor calificado es el que sabe programar. Son mas tiles a las organizaciones ya que sus conocimientos en programacin les permite formular especificaciones mejores y ms completas para las nuevas aplicaciones. Quienes son los Usuarios. Los usuarios primarios, son los que interactan con el sistema. Ellos los alimentan con datos (entrada) o reciben salidas quiz por medio de una terminal. Los usuarios indirectos, son aquellos que se benefician de los resultados o reportes generados por estos sistemas pero que no interactan de manera directa con el hardware o software. Los usuario gerentes, que tienen responzabilidades administrativas en los sistemas de aplicacin. Los usuarios directivos, tienen mayor responzabilidad el los sistemas de informacin.

Que es un Sistema.
Un sistema es un conjunto de componentes que interaccionan entre s para lograr un objetivo comn. Caractersticas Importantes de los Sistemas. Los sistemas que interactuan con su medio ambiente se denominan sistemas abiertos y aquellos que no interactuan con su medio ambiente se conocen como sistemas cerrados. Todos los sistemas actuales son abiertos ya que los sistemas cerrados existen slo como concepto porque sostiene su nivel de operacin siempre y cuando posean informacin de control adecuada. Sistemas Organizacionales. Para mantener su funcionamiento, estos sistema deben estar bajo control. Si los ajustes internos no son satisfactorios, entonces es probable que hagan su aparicin las fuerzas regulatorias del medio ambiente.

Sistemas deInformacin Organizacionales. Los sistemas de informacin estn formados por subsistemas que incluye hardware, software, medios de almacenamiento de datos para archivos y base de datos. Los detalles ms importantes son: 1. 2. 3. 4. Canales informales. Interdependencias Personas y funciones clave. Enlaces crticos de la comunicacin.

Sistemas para el Procesamiento de Transacciones. Los sistemas de procesamiento de transacciones (TPS) tienen como finalidad mejorar las actividades rutinarias de una empresa y de las que depende toda organizacin. Las transacciones ms comunes incluyen: facturacin, entrega de mercanca, pago a empleados y depsitos de cheques.

Se puede contar con los siguiente: Sistemas de Informacin Administrativa. Sistemas para el Soporte deDecisiones. Visin de los Sistemas de Informacin. Estrategia para el Desarrollo de Sistemas.

1.2.- Ciclo de Vida de los Sistmas de Informacin.


Ciclo de Vida Clsico. (Metodologa Tradicional) Exige un enfoque sistemtico y secuencial del desarrollo del software. Est compuesto por las siguientes etapas: Ingeniera y Anlisis del Sistema: El software es parte de un sistema mayor, por lo tanto debe identificarse los requisitos y elementos del sistema. Anlisis de los Requisitos del Software: El proceso de recopilacin de requisitos se centra en el software. Que interfases, naturaleza de las aplicaciones especficas a construir, el mbito de la informacin del software. El diseo de un sistema de informacin produce los detalles que establecen la forma en la que el sistema cumplir con los requerimientos identificados durante la fase de anlisis. Los especialistas en sistemas se refieren a esta etapa como diseo fsico. Codificacin y Prueba Desventajas de este Paradigma: 1. Los proyectos no siempre siguen un flujo secuencial segn el modelo. 2. El Cliente o usuario no siempre logra establecer claramente sus requerimientos al inicio del proyecto como lo exige esta metodologa. 3. Existe una "espera" hasta la ltima etapa para ver el producto de software. Un error no detectado hasta que el programa est funcionando puede ser desastrozo. Mtodo de Desarrollo por Anlisis Estructurado. Los especialistas reconocen la dificultad de comprender de manera completa sistemas grandes y complejos. Mtodo del Prototipo de Sistemas. Este mtodo hace que el usuario participe de manera ms directa en la experiencia del anlisis y diseo que cualquiera de los ya presentados. Sin embargo, al igual que los otros mtodos, el mtodo es til si solo se emplea en el momento y la forma adecuada. Razones para Desarrollar Prototipos de Sistemas. Los usuarios pueden seaIar las caractersticas que les agradara o no tener, junto con los problemas que presenta un sistema que existe y funciona, con mayor facilidad que si se les pidiese que les describieran en forma terica o por escrito. El uso y la experiencia producen comentarios ms significativos que el anlisis de diagramas y las propuestas por escrito.

1.3.- La Crisis del Software


En 1968 una conferencia sobre software, patrocinada por la OTAN, asumi los trminos ingeniera de software y crisis del software. Con estos trminos se quera expresar que el software era caro, poco fiable y escaso. Las metodologas y tcnicas estructurales que han reinado en la dcada de los setentas y ochenta no han eliminado el problema, y de hecho la crisis del software contina hoy en da. Pese a las muchas herramientas y mtodos utilizados, los problemas del diseo descendentes permanecen igual, posiblemente debido a que la complejidad del problema ha crecido considerablemente. Por consiguiente, la POO (Programacin Orientada a Objetos) no slo son nuevos lenguajes de programacin, sino un nuevo modo de pensar y disear aplicaciones que pueden ayudar a resolver problemas que afectan al desarrollo del software. Sin embargo, el lenguaje debe ser capaz de soportar el nuevo paradigma, siendo por consiguiente una parte esencial de esta revolucin.

1.4.- Propuesta de solucin: Tecnologa Orientada a Objetos


La orientacin a objetos puede describirse como el conjunto de disciplinas que desarrollan y modelizan software que facilita la construccin de sistemas complejos a partir de componentes. La programacin orientada a objetos permite una representacin ms directa del modelo del mundo real en el cdigo. El resultado es que la radicalmente transformacin normalmente llevada a cabo de los requisitos del sistema (definido en trminos de usuario) a la especificacin del sistema (definido en trminos de computadora) se reduce considerablemente. Se necesita un nuevo enfoque para construir software en la actualidad. Este nuevo enfoque debe ser capaz de manipular tanto sistemas grandes como pequeos y debe crear sistemas fiables que sean flexibles, mantenibles y capaces de evolucionar para cumplir las necesidades de cambio. La tecnologa a objetos trata de cumplir las necesidades de los usuarios finales, as como las propias de los desarrolladores de productos software. Estas tareas se realizan mediante la modelizacin del mundo real. El soporte fundamental es el modelo objeto. Los cinco elementos (propiedades) ms importantes de este modelo son:
Abstracci,. Encapsulamiento, Modularidad, Jerarqua y Polimorfismo.

Como sugiere Booch, si alguno de estos elementos no existe se dice que el modelo no es orientado a objetos.

1.5.- Tecnologas para el Desarrollo del Software


Los sistemas de informacin basados en computadoras sirven para diversas finalidades que van desde el procesamiento de las transacciones de una empresa hasta proveer de la informacin necesaria para decidir sobre asuntos que se presentan con frecuencia. Mtodo de desarrollo por anlisis estructurado El mtodo de desarrollo del anlisis estructurado tiene como finalidad superar esta dificultad por medio de:
o

La divisin del sistema en componentes y La construccin de un modelo del sistema.

El mtodo incorpora elementos tanto de anlisis como de diseo El anlisis estructurado se concentra en especificar lo que se requiere que haga el sistema o la aplicacin. Permite que las personas observen los elementos lgicos (lo que har el sistema) separados de los componentes fsicos (computadora, terminales, sistemas de almacenamiento, etc.). Despus de esto se puede desarrollar un diseo fsico eficiente para la situacin donde ser utilizado. Reingeniera e ingeniera inversa Los conceptos de reingeniera e ingeniera inversa estn ligados al desarrollo de software a gran escala, donde una mejora en proceso de este desarrollo supone un aumento en la competitividad de la empresa. Ingeniera inversa. La reingeniera e ingeniera inversa prolongan la vida del software.Dado que es una labor estratgica, es conveniente conocer cuando conviene realizar la tarea de reingeniera para una aplicacin y cundo es ms rentable sustituirla e implementar una nueva. Desarrollo de software con y para reuso El desarrollo de software con reso consiste en desarrollar una aplicacin usando software ya existente y en la construccin de un sistema con la intencin de reutilizar partes de l en futuros desarrollos.

UNIDAD II
2.1.- Clases y Objetos
Una clase es la descripcin de un tipo de objeto y un objeto es un elemento (item) que se puede manipular. Un objeto existe en el mundo real (o ms precisamente, en nuestra comprensin del mundo real). Puede ser una parte de cualquier tipo de sistema, por ejemplo, una mquina, una organizacin o un negocio. Todos los objetos son instancias (ejemplares) de una clase, en donde la clase describe las propiedades y comportamiento de un tipo de objeto. Los objetos se pueden instanciar a partir de las clases (instancias creadas del tipo clase). Un objeto se relaciona con una clase de igual modo que una variable se relaciona con un tipo en un lenguaje de programacin. Se utilizan las clases para examinar sistemas y clasificar los objetos que identificamos en el mundo real. Un ejemplo en el mundo natural es el caso de Darwin, que utiliz clases para describir la raza humana. Combin sus clases va herencia para describir su teora de evolucin de las especies. Diagramas de Clases Un diagrama de clases es un tipo de modelo, especficamente un tipo de modelo esttico. Un diagrama de clases describe la vista esttica de un sistema en trminos de clases y relaciones entre ellas. Aunque tiene semejanzas con el modelo de datos, recordemos que las clases no slo muestran las estructuras de nuestra informacin sino que describen tambin su comportamiento. Una clase en un diagrama de clases puede ser directamente implementada en un lenguaje de programacin orientado a objetos que tiene soporte directo para la construccin de una clase. Un diagrama de clases muestra slo las clases, pero existe una variante del diagrama que muestra las instancias de objetos de las clases y que es el diagrama de objetos. Bsqueda de Clases La bsqueda o localizacin de clases es un proceso creativo y debe ser hecho con expertos en el dominio del problema. Las clases deben pertenecer al dominio del problema y darles nombres que representen su conocimiento del mundo real o del negocio. Cuando se buscan clases (clases candidatas) las siguientes cuestiones pueden ayudar a identificarlas [Eriksson 1997]:

Se dispone de informacin que se pueda almacenar o analizar? Si existe informacin que haya de ser almacenada, transformada, analizada o manejada de algn modo, entonces es una posible candidata a clase. La informacin pueden ser conceptos que se deben registrar siempre en el sistema o sucesos o transacciones que ocurren en un momento especfico. Existen sistemas externos? Si es as, son normalmente de inters cuando se modela. El sistema externo se puede ver como clases que nuestro sistema contiene o con el que puede interactuar. Existen dispositivos que el sistema puede manejar? Cualquier dispositivo conectado al sistema se convierte en clases candidatas que manejan estos dispositivos. Existen partes organizacionales? La representacin de una organizacin se hace con clases, especialmente en modelos de negocios. Existen patrones, bibliotecas de clases, componentes, etc.? Si se tienen patrones, bibliotecas de clases o componentes de proyectos anteriores, colegas, o fabricantes, normalmente contendrn clases candidatas. Qu roles juegan los actores en el negocio o aplicacin? Estos roles se pueden ver como clases; por ejemplo, usuario, operador del sistema, cliente, etc.

Banda de Nombres La parte superior del rectngulo que representa a la clase contiene el nombre de la misma; se escribe centrado y en letra negrita. Es conveniente que el nombre se deduzca del dominio del problema y sea lo menos ambiguo posible. Por consiguiente, debe ser un nombre como, por ejemplo, prstamo o deuda. El nombre de la clase no debe tener un prefijo o un sufijo.

Banda de Atributos Un atributo tiene un tipo, que indica la clase de atributo. Los tipos usuales de atributos son los primitivos (boolean, real, enteros, enumeracin...). Pueden ser especficos para ciertos lenguajes de programacin, sin embargo, se puede utilizar cualquier tipo, incluido otra clase. Los atributos pueden tener diferente visibilidad. La visibilidad describe si el atributo es visible y puede ser referenciado por otras clases distintas de aquella en que se ha definido. Los atributos y su representacin grfica pueden ser:

Pblicos: Se pueden utilizar y visualizar fuera de la clase (se representa con un signo ms delante del nombre). Privados: No se puede acceder al mismo desde otras clases (se representa con un signo menos delante del nombre). Protegidos: Se utiliza en notaciones de generalizacin y especializacin para representar atributos protegidos relacionados con clases derivadas.

Un atributo puede ser definido como un atributo de mbito de clase Figura. Esto significa que el atributo est compartido entre todos los objetos de una cierta clase (a veces se denomina variable de clase). Un atributo de mbito de clase se ha de subrayar. Clases Abstractas Una clase abstracta es una clase que no tiene ningn objeto, es decir, de la cual no se pueden crear instancias (objetos). Una clase abstracta slo se utiliza para heredar de ella atributos y comportamientos comunes. Una clase se puede especificar explcitamente como abstracta poniendo la etiqueta {abstract} dentro de la banda de nombre de la clase y debajo del mismo. Objetos Un objeto de una clase se representa por un rectngulo con el nombre del objeto y su clase subrayada.

2.2.- Mtodos
La Banda de Operaciones. Las operaciones de una clase se utilizan para manipular los atributos (modificar el estado de la clase) o realizar alguna otra accin; son funciones a las que se llama o invoca, son interiores a la clase y se pueden aplicar sobre objetos de esa clase. La signatura de la operacin describe todo lo que necesita utilizar la operacin; contiene el tipo de retorno, nombre y parmetros. Otro concepto importante que ha incorporado la notacin UML es la persistencia. Una clase persistente es aquella cuyos objetos existen despus de que el programa que los ha creado deja de existir. Los objetos de clases persistentes se almacenan en una base de datos, un archivo u otro almacenamiento permanente y, normalmente, tienen una operacin de mbito de clase para manejar el almacenamiento de los objetos; por ejemplo, crear (), almacenar (), cargar (), eliminar () ...Una clase se puede describir como persistente, poniendo la

propiedad persistente en la banda nombre (se muestra en el diagrama de clase con la palabra persistente entre llaves, {persistente}).

2.3.- Mensajes
Como hemos visto, cada objeto es una estructura compleja en cuyo interior hay datos y programas, todos ellos relacionados entre s, como si estuvieran encerrados conjuntamente en una cpsula. El hecho de que cada objeto sea una cpsula facilita enormemente que un objeto determinado pueda ser transportado a otro punto de la organizacin, o incluso a otra organizacin totalmente diferente que precise de l. Si el objeto ha sido bien construido, sus mtodos seguirn funcionando en el nuevo entorno sin problemas. Esta cualidad hace que la OOP sea muy apta para la reutilizacin de programas. Mensaje Los mensajes que se envan entre objetos pueden ser de distintos tipos, tambin segn como se producen en el tiempo; existen mensajes simples, sincrnicos, balking, timeout y asncronos Toda la comunicacin entre los objetos debe realizarse en la forma de mensajes. En un sistema donde todo es un objeto y toda interaccin es a travs de mensajes, el trfico de mensajes afecta el rendimiento. Los objetos son inaccesibles, e impiden que otros objetos, los usuarios, o incluso los programadores conozcan cmo est distribuida la informacin o qu informacin hay disponible. Esta propiedad de los objetos se denomina ocultacin de la informacin.

2.4.- Encapsulamiento
El encapsulamiento o encapsulacin es la propiedad que permite asegurar que el contenido de la informacin de un objeto est oculta al mundo exterior: el objeto A no conoce lo que hace el objeto B, y viceversa. La encapsulacin, en esencia, es el proceso de ocultar todos los secretos de un objeto que no contribuyen a sus caractersticas esenciales. La encapsulacin permite la divisin de un programa en mdulos. Estos mdulos se implementan mediante clases, de forma que una clase representa la encapsulacin de una abstraccin. En la prctica, esto significa que cada clase debe tener dos partes: un interfaz y una implementacin. El interfaz de una clase captura slo su vista externa y la implementacin contiene la representacin de la abstraccin, as como los mecanismos que realizan el comportamiento deseado.

2.5.- Herencia
Las clases se pueden organizar en estructuras jerrquicas. La herencia es una relacin entre clases donde una clase comparte la estructura o comportamiento, definida en una (herencia simple) o mas clases (herencia mltiple). Se denomina superclase a la clase de la cual heredan otras clases. De modo similar, una clase que hereda de una o mas clases se denomina subclase. Una subclase heredar atributos de una superclase mas elevada en el rbol jerrquico. La herencia, por consiguiente, define un tipo de jerarqua entre clases, en la que una subclase hereda de una o mas superclases.

La herencia mltiple es una forma de herencia en donde una clase hereda la estructura y el comportamiento de dos clases base. En otras palabras, hay mltiples clases padre (ms de una subclase) para la clase hija (o derivada). La herencia mltiple, por otra parte, implica clases base mltiples. Una clase ProfesorAyudante hereda propiedades de las clases Estudiante y Profesor, que a su vez heredan propiedades de la clase base Persona.

2.6.- Polimorfismo
Polimorfismo es la propiedad que indica, literalmente, la posibilidad de que una entidad tome muchas formas. En trminos prcticos, el polimorfismo permite referirse a objetos de clases diferentes mediante el mismo elemento de programa y realizar la misma operacin de diferentes formas, segn sea el objeto que se referencia en ese El polimorfismo requiere ligadura tarda o postergada (tambin llamada dinmica), y esto se puede producir en lenguajes de programacin orientados a objetos. Los lenguajes no orientados a objetos soportan ligadura temprana o anterior; esto significa que el compilador genera una llamada a un nombre especfico de funcin y el enlazador (linker) resuelve la llamada a la direccin absoluta del cdigo que se ha de ejecutar.

2.7.- Anlisis Orientado a Objetos


Como primera aproximacin clsica, se proponen como clases y objetos los elementos de una categorizacin clsica. Un anlisis del comportamiento, de acuerdo con el agrupamiento conceptual, lleva a formar clases basadas en grupos de objetos que exhiben un comportamiento similar. Se agrupan por comunes responsabilidades (servicios ofrecidos en sus interfaces), formando jerarquas de especializacin de responsabilidades. En el anlisis de dominio se intentan identificar objetos, operaciones y relaciones que los expertos en el campo perciban como importantes en el dominio del problema. Use-Case anlisis o con guiones: se usa conjuntamente con alguno de los anteriores. Se ejemplifican situaciones reales de utilizacin, a partir de unas condiciones iniciales. Debe provocar en los participantes una estructuracin clara, y separacin de responsabilidades. Las tarjetas CRC (Clase/Reponsabilidades/Colaboradores) sirven para analizar guiones. Se escriben en tarjetas los nombres de clases, sus reponsabilidades y sus colaboradores. Deben quedar claros los patrones jerrquicos entre clases, y el flujo de mensajes. En la descripcin informal se escribe el problema en frases simples, subrayando nombres y verbos. Se convierte a los nombres en objetos y los verbos son operaciones sobre objetos. Obliga a trabajar sobre el vocabulario del problema, pero tiene el inconveniente de la imprecisin del lenguaje, a la hora de describir comportamientos precisos. El anlisis de estructuras usa mtodos de programacin estructural, de los que deriva los elementos del modelo de objetos.

2.8.- Diseo Orientado a Objetos


El Unified Modeling Languaje (UML) es el sucesor nato de los mtodos de anlisis y diseo orientados a objetos que aparecieron a finales de los ochenta y primeros aos de los noventa, tales como Coad/yourdon, Shlaer y Mellar Booch, OMT, Fusion, Jacobson, etc. UML unifica los mtodos de Booch, Rumbaugh (OMT) y Jacobson (OOSE), pero se espera que sea algo ms que eso. UML est sufriendo un proceso de estandarizacin por el grupo OMG adems del comit ISO/ANSI.

Grady Booch y James Rumbaugh comenzaron a trabajar en UML a principios de 1994. Su objetivo era crear un nuevo mtodo, Unified Method que unificara el mtodo Booch y OMT-2 que Rumbaugh estaba comenzando a desarrollar. En 1995, Ivar Jacobson -creador del mtodo Objectory y de OOSE- se uni a Rational Software -la empresa de Grady Booch- y comenzaron a trabajar juntos en el nuevo mtodo Unified Modeling Language (UML). En la conferencia OOPSLA '95, Grady Booch y James Rumbaugh presentaron la primera descripcin pblica de su mtodo unificado: versin 0.8 del Unified Method (versin que fue tambin la primera de UML utilizada por el autor). En julio de 1996 se present la versin 0.9 (julio, 1996) y por fin, en enero de 1997, varias organizaciones facilitaron sugerencias y mejoras a UML, y Rational lanz como consecuencia la versin 1.0 y su documentacin; en septiembre de 1997 se present la versin 1.1. El UML, en su estado actual, define una notacin y un metamodelo. La notacin es la parte fundamental que se ve en los modelos; es la sintaxis del lenguaje de modelado. Por ejemplo, la notacin del diagrama de clases define cmo se representan elementos y conceptos tales como clases, asociaciones y multiplicidad. Un metamodelo es un modelo que representa al mtodo orientado a objetos y lo define con rigor; en esencia, es un diagrama, normalmente un diagrama de clase, que define la notacin. UML est ganando en popularidad y se espera que la publicacin de la obra conjunta de Booch, Rumbaugh y Jacobson a lo largo de 1998 suponga el espaldarazo definitivo para el mtodo. El lector observar grandes semejanzas entre UML y OMT. Algunos de los ejemplos que se muestran en este captulo se han extrado del documento de especificaciones de la versin 1.1 UML que se puede descargar en Internet en http: //www.rational.com. Modelado Orientado a Objetos. Cuando se realiza modelado orientado a objetos, las clases y objetos junto a sus relaciones son los principales elementos de modelado. El modelo de clases y objetos muestra el sistema que se trata de describir. El sistema de modelado se ha utilizado desde la antigedad para describir sistemas complejos de modo que pudieran ser comprendidos fcilmente por diferentes tipos de personas. Una vez que el modelo se ha construido y se dispone de clases y relaciones entre ellas, el proceso posterior de la programacin orientada a objetos implicar la conversin de las mismas en cdigo real. Pero llegar a la implementacin del modelo mediante un lenguaje de programacin como C++ y Java, y luego, las posteriores etapas de pruebas, implantacin y mantenimiento, requieren una buena construccin del modelo de la realidad de la aplicacin. Dicho de otro modo, el anlisis orientado a objetos trata de crear modelos de dominios de inters de la aplicacin.

2.9.- Programacin Orientada a Objetos


Al principio de la dcada de los sesenta, Kristen Nygaard y Ole-Johan Dhal desarrollaron Simula en el Norwegian Computer Center (NCC), un lenguaje que soportaba modelado para simulacin de procesos industriales y cientficos. Fue un lenguaje de propsito general que ofreca capacidad de simulacin de sistemas. Sin embargo, sus usuarios descubrieron pronto que Simula proporcionaba

nuevas y poderosas posibilidades para fines distintos de la simulacin, como la elaboracin de prototipos y el diseo de aplicaciones. Las sucesivas versiones de Simula fueron mejorndose hasta llegar a Simula-67 (aparicin en diciembre de 1966). Simula-67 se derivaba de Algol 60, donde tiene sus races, y se dise fundamentalmente como un lenguaje de programacin de diseo; tom de Algol el concepto de bloque e introdujo el concepto de objeto. Los objetos de Simula tenan su propia existencia y podan comunicarse entre s durante un proceso de simulacin. Conceptualmente, un objeto contena tanto datos como las operaciones que manipulaban esos datos. Las operaciones se llamaron mtodos. Simula incorporaba tambin la nocin de clases, que se utilizaron para describir la estructura y comportamiento de un conjunto de clases. La herencia de clases fue tambin soportada por Simula. La herencia organiza las clases en jerarquas, permitiendo compartir implementacin y estructura. En esencia, Simula sent la base de los lenguajes orientados a objetos y defini algunos de los conceptos clave de la orientacin a objetos. Adems, Simula era un lenguaje fuertemente tipificado. Esto significa que el tipo de cada variable se conoce en tiempo de compilacin, de modo que los errores que implican tipos se encuentran en esta etapa y no cuando el programa se ejecuta. Simula-67 fue el primer lenguaje de programacin que incorpor mecanismos para soportar los conceptos orientados a objetos ms sobresalientes:

Encapsulamiento y objetos, que agrupan juntos atributos de datos y acciones (mtodos) que procesen esos datos. Verificacin esttica de tipos, que se realiza durante el proceso de compilacin para proporcionar seguridad en tiempo de ejecucin para la manipulacin externa de los atributos de los objetos. Clases, como plantillas o patrones de objetos. Herencia, como medio de agrupar clases con propiedades comunes. Ligadura dinmica (polimorfismo), para permitir a las clases de objetos que tengan interfaces idnticos y propiedades que se puedan intercambiar.

Alan Kay cre Smalltalk-80 en Xerox PARC (Xerox Palo Alto Research Park) con Adele Goldberg, que previamente haba trabajado con una implementacin de Simula. Smalltalk es un lenguaje orientado a objetos puro, todos es un objeto de una clase y todas las clases heredan de una nica clase base denominada Obj ect. Smalltalk afirm el trmino mtodo para describir las acciones realizadas por un objeto y el concepto de paso de mensajes como el medio para activar mtodos. Es tambin un lenguaje tipificado dinmicamente, que liga (enlaza) un mtodo a un mensaje en tiempo de ejecucin. Smalltalk ha sido, a su vez, el inspirador de un gran nmero de lenguajes OO. Entre ellos destaquemos Eiffel, Smalltalk-80, Smalltalk/V, C++, Actor, Objective-C y CLOS, as como extensiones OO de lenguajes tradicionales, tales como Object Pascal, Object COBOL, etc. Bertran Meyer, el diseador de Eiffel, fue tambin un usuario de Simula, e incluso lleg a ser presidente de la Asociacin de Usuarios de Simula. lean Ichbiah, el diseador jefe de Ada-83, dirigi un equipo que implement un subconjunto de Simula, y Bjarne Stroustrup, el diseador de C + +, utiliz Simula y siempre ha agradecido su influencia en el diseo de C + + .

Existen varias versiones y dialectos de Smalltalk: Smalltalk -72, -74, -76, -78, -80, y ms recientemente -y seguramente la ms popular- Smalltalk/V de Digitalk. Smalltalk no es un lenguaje tipificado. Smalltalk es extraordinariamente rico en conceptos orientados a objetos. En Smalltalk todo es un objeto, incluyendo clases base y tipo base. Esto significa que la potencia de Smalltalk, como un entorno de programacin completo, se fundamenta en el envo de mensajes a objetos. Otra caracterstica fundamental que diferencia a Smalltalk es su capacidad de concurrencia. La concurrencia es un aspecto del mundo real. Por ejemplo, en un entorno de oficina, secretarias, administrativos, gerentes y otros empleados funcionan simultnea e independientemente. Se comunican entre s, a travs de conversaciones, informes, correo electrnico, etc. Smalltalk emple la construccin denominada proceso para soportar concurrencia. Durante la dcada de los ochenta, los conceptos orientados a objetos (tipos abstractos de datos, herencia, identidad de objetos y concurrencia), Smalltalk, Simula y otros lenguajes comenzaron a mezclarse y producir nuevos lenguajes orientados a objetos, as como extensiones y dialectos. El desarrollo de lenguajes de orientacin a objetos en esa dcada se muestra en la siguiente clasificacin: 1. Extensiones, dialectos y versiones de Smalltalk. Xerox y Textronix incorporaron en sus mquinas, a principios de los ochenta, la versin Smalltalk-80, que posteriormente se fue incorporando a otras muchas plata- formas. Digitalk lanz Smalltalk/V para computadoras personales IBM y compatibles. 2. Extensiones orientadas a objetos de lenguajes convencionales. Uno de los lenguajes orientados a objetos ms populares es C + +. Este lenguaje fue diseado por Bjarne Stroustrup en A T &T al principio de los ochenta [Stroustrup, 1986]. La primera implementacin del lenguaje C++ se lanz como un preprocesador a los compiladores C. C + + proporcion dos construcciones para definiciones de clases. El primer mtodo es una extensin de la construccin struct (estructura de C) y la otra nueva construccin class (clase). C++ incorpor jerarqua de clases y permita subclases que podan acceder a mtodos y variables instancias de otras clases de su jerarqua. El lenguaje C++ permita la ligadura dinmica y el polimorfismo, as como sobrecarga de funciones y operaciones. Sin embargo, al contrario que Smalltalk, las primeras versiones de C++ no comercializaban bibliotecas grandes de clases predefinidas. Otro dialecto importante de C++, con propiedades orientadas a objetos, es Objective-C [Cox 1987]. Este lenguaje es un superconjunto de C, que incorpora caractersticas orientadas a objetos de Smalltalk. Al igual que Smalltalk, Objective-C inclua una gran coleccin de clases predefinidas que permita simplificar el proceso de desarrollo. ObjectiveC soportaba tipos abstractos de datos, herencia y sobrecarga de operadores. Sin embargo, al contrario que C++, no ampliaba la definicin de construcciones existentes en lenguajes, y dise nuevas construcciones y operadores para realizar tareas tales como definicin de clases y paso de mensajes. Las computadoras NEXT, cuyo xito no pas de unos aos, eligieron Objective-C como su principal lenguaje de desarrollo. Niklaus Wirt y un grupo de ingenieros informticos de Apple Computer disearon Object Pascal [Schmucker, 1986]. Extendi el lenguaje

Pascal con soporte para tipos abstractos de datos, mtodos y herencia. Incluy el concepto de tipo de objeto y definicin de clases. Los nuevos lenguajes Ada-95 y Java son totalmente orientados a objetos. 3. Lenguajes orientados a objetos fuertemente tipificados. Simula fue uno de los lenguajes orientados a objetos que se desarrollaron en la dcada de los ochenta y que fueron implementados en diversas plataformas. Otros lenguajes han emergido en la dcada de los ochenta, con caractersticas fuertemente tipificadas (con verificacin estricta de tipos). Un lenguaje disponible comercialmente y muy interesante es Eiffel [Meyer, 1988] de Interactive Software Engineering, Inc. Adems de encapsulamiento y herencia, Eiffel incorpora muchas caractersticas orientadas a objetos, tales como tipos paramtricos y pre y postcondiciones para mtodos. Otro lenguaje fuertemente tipificado que soporta conceptos orientados a objetos (abstraccin, objetos, tipos paramtricos) es Ada, aunque la versin Ada-83 presenta el inconveniente de no soportar herencia. 4. Extensiones orientadas a objetos de LISP. Existen diferentes versiones de LISP, aunque la ms conocida y notable es CLOS (Common List Object System). CLOS es un lenguaje OO que introduce notables mejoras y tiene garantizada larga vida, especialmente desde la creacin del comit X3J13 de ANSI para la estandarizacin del lenguaje.

UNIDAD III
3.1.- Evolucin del Lenguaje Pascal
El lenguaje de programacin Object Pascal que usamos en Delphi no fue inventado en 1995 con el entorno visual de desarrollo de Borland. Simplemente, era una extensin de Object Pascal, que ya se estaba usando en los productos Pascal de Borland. Pero Borland no invent Pascal, slo ayud a hacerlo popular y lo extendi un poco ... El Pascal de Wirth El lenguaje Pascal fue diseado originalmente EN 1971 por Niklaus Wirth, profesor en el Politcnico de Zrich, Suiza. Fue concebido como versin simplificada con fines educativos el lenguaje Algol, que data de 1960. Cuando Pascal fue diseado, ya existan muchos lenguajes de programacin, pero pocos eran de uso generalizado : FORTRAN, C, ensamblador, COBOL. La idea clave del nuevo lenguaje fue el orden, administrado mediante un concepto slido de tipo de dato, y requiriendo declaraciones de tipo y controles de programa estructurados. El lenguaje fue diseado tambin para ser un instrumento de enseanza a estudiantes que aprendan a programar. Turbo Pascal El compilador de Pascal de Borland, famoso en todo el mundo, fue presentado en 1985. El compilador Turbo Pascal ha sido una de las series de compiladores que mejor se han vendido de todos los tiempos, e hizo de Pascal un lenguaje especialmente importante en la plataforma PC, gracias a su equilibrio entre simplicidad y potencia.

Turbo Pascal introdujo un entorno integrado de programacin (IDE) en que se poda editar el cdigo (en un editor compatible con WordStar), ejecutar el compilador, ver los errores, y volver directamente a las lneas que contenan los errores. Ahora suena trivial, pero antes de eso haba que salir del editor, volver a MS-DOS, ejecutar el compilador de lnea de comandos, anotar las lneas errneas, abrir de nuevo el editor y buscarlas. Adems, Borland puso a la venta Turbo Pascal por 49 dlares (USA), mientras que el compilador de Pascal de Microsoft estaba a unos cuantos cientos de dlares. Los muchos aos de xito de Turbo Pascal contribuyeron a que Microsoft finalmente retirase su compilador del mercado. El Pascal de Delphi

Tras 9 versiones de compiladores de Turbo Pascal y Borland Pascal, que fueron extendiendo el lenguaje gradualmente, Borland puso a la venta Delphi en 1995, convirtiendo Pascal en un lenguaje de programacin visual. Delphi extiende el lenguaje Pascal de muchas formas, incluyendo muchas extensiones orientadas a objetos que son distintas de otras versiones de Object Pascal, incluidas las del compilador Borland Pascal with Objects.

3.2.- Definicin de Clases


Clases El mecanismo de clases de Python aade clases al lenguaje con un mnimo de sintaxis y semntica nueva. Es una mezcla de los mecanismos de clase de C++ y Modula-3. Como en los mdulos, las clases de Python no ponen una barrera absoluta entre la definicin y el usuario, sino que ms bien se fan de la buena educacin del usuario para no ``invadir la definicin''. Se mantienen las caractersticas ms importantes con plena potencia. El mecanismo de herencia de clases permite mltiples clases base, una clase derivada puede redefinir cualquier mtodo de sus clases base y un mtodo puede llamar a un mtodo de una clase base con el mismo nombre. Los objetos pueden contener una cantidad arbitraria de datos privados.

En terminologa C++, todos los miembros de la clase (datos incluidos) son pblicos y todas las funciones miembro son virtuales. No hay constructores ni destructores especiales. Como en Modula-3, no existen abreviaturas para hacer referencia a los miembros del objeto desde sus propios mtodos. La funcin mtodo se declara con un primer argumento explcito que representa al objeto y que se proporciona implcitamente al llamar a la funcin. Como en Smalltalk, las clases son ellas mismas objetos, aunque en un sentido ms amplio de la palabra: en Python, todos los tipos de datos son objetos. Esto proporciona la semntica para importar y renombrar. Sin embargo, como en C++ o en Modula3, los tipos internos no pueden ser la clase base para extensiones del usuario. Adems, como en C++ y al contrario de Modula-3, la mayora de operadores internos con sintaxis especial (operadores aritmticos, ndices, etc.) se pueden redefinir en las clases. Unas palabras sobre la terminologa A falta de una terminologa universalmente aceptada para hablar de clases, har uso ocasional de trminos de Smalltalk y C++ (hara uso de trminos de Modula-3, ya que la semntica orientada al objeto es ms cercana a Python que la de C++, pero no espero que muchos lectores la dominen). Tambin he notado que hay un agujero en la terminologa de los lectores orientados a objetos: La palabra ``objeto'' en Python no significa necesariamente una instancia de una clase. Como en C++ y en Modula-3, al contrario que en Smalltalk, no todos los tipos son clases: Los tipos internos, como listas y enteros no lo son, ni siquiera algunos tipos ms exticos, como los ficheros. Sin embargo, todos los tipos de Python comparten algo de semntica comn, descrita adecuadamente mediante la palabra ``objeto''. Los objetos tienen individualidad. Se pueden asociar mltiples nombres (y en diferentes mbitos) al mismo objeto, lo que se conoce como ``generar alias'' en otros lenguajes. Esto no se aprecia a primera vista en Python y no hace falta tenerlo en cuenta cuando se trata con tipos inmutables (nmeros, cadenas, tuplas...). Sin embargo los alias tienen un efecto (buscado!) en la semntica del cdigo Python que involucra los objetos mutables, como listas, diccionarios y la mayora de los tipos que representan entidades externas al programa (ficheros, ventanas...). Se suele usar en beneficio del programa, ya que los alias se comportan como punteros en algunos aspectos. Por ejemplo, pasar un objeto es poco costoso, ya que la implementacin slo pasa un puntero. Si la funcin modifica el objeto que pasa como argumento, el que llama a la funcin ver los cambios. De este modo se elimina la necesidad de tener los dos mecanismos de traspaso de argumentos de Pascal. mbitos y espacios nominales en Python

Antes de presentar las clases, debo contar algo sobre las reglas de alcance de Python. Las definiciones de clases realizan truquitos con los espacios nominales y se necesita saber cmo funcionan los alcances y espacios nominales para comprender plenamente lo que ocurre. Incidentalmente, el conocimiento de este tema es til para cualquier programador en Python avanzado. Empecemos con unas definiciones. Un espacio nominal es una correspondencia entre nombres y objetos. La mayora de los espacios de nombres se implementan en la actualidad como diccionarios, pero eso no se nota en modo alguno (salvo por el rendimiento) y puede cambiar en el futuro. Ejemplos de espacios nominales son:

El conjunto de nombres internos (funciones como abs() y las excepciones internas). Los nombres globales de un mdulo. Los nombres locales dentro de una llamada a funcin.

En cierto sentido, el conjunto de atributos de un objeto tambin forma un espacio nominal. Lo que hay que tener claro de los espacios nominales es que no existe absolutamente ninguna relacin entre los nombres de diferentes espacios. Por ejemplo, dos mdulos pueden definir una funcin ``maximizar'' sin posibilidad de confusin; los usuarios de los mdulos deben preceder el nombre con el nombre del mdulo. Por cierto, utilizo la palabra atributo para referirme a cualquier nombre que venga detrs de un punto; por ejemplo, en la expresin z.real, real es un atributo del objeto z. Hablando estrictamente, las referencias a nombres en un mdulo son referencias a atributos. En la expresin nombremod.nombrefunc, nombremod es un objeto mdulo y nombrefunc es atributo suyo. En este caso, resulta que existe una correspondencia directa entre los atributos del mdulo y los nombres globales definidos en el mdulo: comparten el mismo espacio nominal! Los atributos pueden ser de slo lectura o de lectura/escritura. En este caso, es posible asignar valores a los atributos. Los atributos de los mdulos son de lectura/escritura: Se puede escribir "nombremod.respuesta = 42". Los atributos de lectura/escritura se pueden borrar con la sentencia del, por ejemplo: "del nombremod.respuesta". Los espacios nominales se crean en diferentes momentos y tienen tiempos de vida diferentes. El espacio nominal que contiene los nombres internos se crea al arrancar el intrprete de Python y nunca se borra. El espacio nominal global de un mdulo se crea al leer la definicin del mdulo. Normalmente, los espacios nominales de los mdulos tambin duran hasta que se sale del intrprete. Las sentencias ejecutadas por el nivel superior de llamadas, ledas desde un guion o interactivamente, se consideran parte de un mdulo denominado __main__, as que tienen su propio espacio nominal (los nombres internos tambin residen en un mdulo, llamado __builtin__). El espacio nominal local de una funcin se crea cuando se llama a la funcin y se borra al salir de la funcin, por una sentencia "return"o si salta una excepcin que la funcin no captura (en realidad, lo ms parecido a lo que ocurre es el olvido). Por supuesto, las llamadas recursivas generan cada una su propio espacio nominal. Un mbito es una regin textual de un programa Python en que el espacio nominal es directamente accesible. ``Directamente accesible'' significa en este contexto una referencia sin calificar (sin puntos) que intenta encontrar un nombre dentro de un espacio nominal.

Aunque los mbitos se determinan estticamente, se utilizan dinmicamente. En cualquier punto de la ejecucin, existen exactamente tres mbitos anidados (es decir, hay tres espacios nominales accesibles directamente): el mbito interior, el primero en que se busca el nombre, que contiene los nombres locales, el mbito medio, siguiente en la bsqueda de nombres, que contiene los nombres globales del mdulo, y el mbito externo, el ltimo en la bsqueda, que contiene los nombres internos. Normalmente, el mbito local hace referencia a los nombres locales de la funcin en curso (textualmente). Fuera de las funciones, el mbito local hace referencia al mismo espacio nominal que el mbito global: el espacio nominal del mdulo. Las definiciones de clases colocan otro espacio nominal en el mbito local. Es importante darse cuenta de que los mbitos se determinan textualmente: El mbito global de una funcin definida en un mdulo es el espacio nominal de este mdulo, sin importar desde dnde o con qu alias se haya llamado a la funcin. Por otra parte, la bsqueda real de nombres se lleva a cabo dinmicamente, en tiempo de ejecucin. Sin embargo, la definicin del lenguaje tiende a la resolucin esttica de los nombres, as que no te fes de la resolucin dinmica de los nombres! De hecho ya se determinan estticamente las variables locales. Un asunto especial de Python es que las asignaciones siempre van al mbito ms interno. Las asignaciones no copian datos, simplemente enlazan nombres a objetos. Lo mismo vale para los borrados: la sentencia "del x" elimina el enlace de x del espacio nominal al que hace referencia el mbito local. De hecho, todas las operaciones que introducen nombres nuevos utilizan el mbito local. Particularmente, las sentencias import y las definiciones de funciones asocian el nombre del mdulo o funcin al mbito local. Se puede utilizar la sentencia global para indicar que ciertas variables residen en el mbito global. Un primer vistazo a las clases Las clases introducen una pizca de sintaxis nueva, tres tipos de objeto nuevos y algo de semntica nueva. Sintaxis de definicin de clases La forma ms simple de definicin de clase tiene este aspecto: class nombreClase: <sentencia-1> . . . <sentencia-N> Las definiciones de clases, como las definiciones de funciones (sentencias def) deben ejecutarse para tener efecto (es perfectamente correcto colocar una definicin de clase en una rama de una sentencia if o dentro de una funcin). En la prctica, las sentencias de dentro de una definicin de clase sern definiciones de funciones, pero se permite otro tipo de sentencias, lo que resulta til en algunos casos, ya veremos esto. Las definiciones de funciones interiores a la clase suelen tener una lista de argumentos un poco especial, dictada por las convenciones de llamada a mtodo. Esto tambin se explica ms adelante.

Cuando se entra en una definicin de clase, se genera un nuevo espacio nominal, que se utiliza como mbito local; as que todas las asignaciones a variables locales caen dentro de este nuevo espacio nominal. En particular, las definiciones de funciones enlazan aqu el nombre de la nueva funcin. Cuando se abandona una definicin de clase de manera normal (se ejecuta la ltima lnea de su cdigo), se crea un objeto de clase. Es, sencillamente, un envoltorio del contenido del espacio nominal creado por la definicin de la clase. Se ver con ms detalle en la siguiente seccin. El mbito local original (el que estaba activo cuando se entr en la definicin de clase) se reinstancia y el objeto clase se enlaza con el nombre de clase dado en la cabecera de la funcin (en el ejemplo nombreClase).

3.3.- Declaracin de Variables Objeto (Instancias)


Objetos clase Los objetos de clase soportan dos tipos de operaciones: referencia a atributos e instanciacin. Las referencias a atributos utilizan la sintaxis estndar que se utiliza para todas las referencias a atributos en Python: obj.nombre. Los nombres de atributos vlidos son todos los nombres que estaban en el espacio nominal de la clase cuando fue creada la clase. Por lo tanto, si la definicin de la clase tiene este aspecto:
class MiClase: "Simple clase de ejemplo" i = 12345 def f(x): return 'hola, mundo'

MiClase.i y MiClase.f son referencias a atributos vlidas, que devuelven un entero y un objeto mtodo, respectivamente. Tambin se puede asignar valores a los atributos de una clase; puedes cambiar el valor de MiClase.i con una asignacin. __doc__ es tambin un atributo vlido, que devuelve la cadena de documentacin que corresponde a la clase: "Simple clase de ejemplo". La instanciacin de clases utiliza notacin de funcin. Basta con imaginar que el objeto clase es una funcin sin parmetros que devuelve una instancia nueva de la clase. Por ejemplo, siguiendo con el ejemplo anterior:
x = MiClase()

crea una nueva instancia de la clase y la asigna a la variable local x. La operacin de instanciacin (``la llamada'' a un objeto clase) genera un objeto vaco. Muchas clases prefieren generar los objetos en un estado inicial conocido. Por ello, una clase puede definir un mtodo especial denominado __init__(), as:
def self.vaciar() __init__(self):

Cuando una clase define un mtodo __init__(), la instanciacin de clases llama automticamente a __init__() para la instancia de clase recin creada. As que, en el ejemplo de la Bolsa, se puede obtener una instancia de clase inicializada nueva mediante:

x = Bolsa()

Por supuesto, el mtodo __init__() podra tener argumentos que le aadiran flexibilidad. En tal caso, los argumentos proporcionados al operador de instanciacin de clase se pasan a __init__(). Por ejemplo,
>>> class Complejo: ... def __init__(self, parteReal, parteImaginaria): ... self.r = parteReal ... self.i = parteImaginaria ... >>> x = Complejo(3.0,-4.5) >>> x.r, x.i (3.0, -4.5)

Objetos instancia Qu se puede hacer con los objetos instancia? Las nicas operaciones que entienden son las referencias a atributos. Hay dos tipos de nombres de atributo vlidos. A los primeros los voy a llamar atributos de datos. Corresponden a las ``variables de instancia'' de Smalltalk o a los ``miembros dato'' de C++. No es necesario declarar los atributos de datos. Como las variables locales, aparecen por arte de magia la primera vez que se les asigna un valor. Por ejemplo, si x es una instancia de la clase MiClase creada anteriormente, el cdigo siguiente mostrar el valor 16 sin dejar rastro:
x.contador = 1 while x.contador < 10: x.contador = x.contador * 2 print x.contador del x.contador

El segundo tipo de referencia a atributo que entienden los objetos instancia son los mtodos. Un mtodo es una funcin que ``pertenece a'' un objeto. En Python, el trmino mtodo no se limita a las instancias de una clase, ya que otros tipos de objeto pueden tener mtodos tambin. Por ejemplo, los objetos de tipo lista tienen mtodos llamados append, insert, remove, sort, etc. Sin embargo, vamos a utilizar ahora el trmino exclusivamente para referirnos a los mtodos de objetos instancia de una clase, salvo que se indique lo contrario. Los nombres vlidos de mtodos de un objeto instancia dependen de su clase. Por definicin, todos los atributos de una clase que son objetos funcin (definidos por el usuario) definen los mtodos correspondientes de sus instancias. As que, en nuestro ejemplo, x.f es una referencia a mtodo correcta, ya que MiClase.f es una funcin, pero x.i no lo es, ya que MiClase.i no es una funcin. Pero x.f no es lo mismo que MiClase.f - es un objeto mtodo, no un objeto funcin.

3.4.- Marcos de Objetos


MARCOS (FRAMES) Definicin : Coleccin de atributos, ranuras (slots), con valores asociados (y posibles restricciones entre los valores), que describe alguna entidad del mundo. Esta definicin no representa fielmente el concepto que tena Minsky de los MARCOS(primero en introducir este concepto en 1975). En su trabajo, propona formular una teora global y coherente para representar el razonamiento de sentido comn. La esencia de la propuesta del autor se puede ver en el siguiente prrafo:

"Cuando uno se encuentra frente a una nueva situacin (o hace un cambio sustancial en la visin que tena previamente de un problema), uno selecciona de la memoria una estructura llamada marco. Este es un contexto que se recuerda, a ser adaptado para adecuarse a la realidad, cambiando detalles en la medida de lo necesario. Un marco es una estructura de datos para representar una situacin estereotipada, como estar en un cierto tipo de sala, o asistir a una fiesta de cumpleaos infantil. Vinculados a cada marco existen diversos tipos de informacin. Parte de esa informacin es acerca de cmo usar el marco. Alguna es respecto de lo que uno espera que ocurra a continuacin. Otra parte es acerca de que hacer si esas expectativas no se confirman." Los MARCOS se pueden ver como nodos complejos, ms evolucionados que los de las redes semnticas. Nacen por una necesidad de tener una mayor estructura en los nodos y en los arcos. Un concepto no existe en funcin de sus relaciones con otros conceptos (redes semnticas) sino como un todo. Su esencia sta dada por el conjunto de atributos que lo definen. Tipos de MARCOS:

Individuales: descripciones (aserciones) de una instancia individual de una entidad. Genricos: descripciones (aserciones) de una categora (clase) de entidades.

Tipos de informacin asociados a las ranuras (slots) de los MARCOS:


Valores exactos. Pueden ser valores por defecto. Restricciones de valor, tipos de valores posibles; de nmero, valor mximo y mnimo. Procedimientos, indican cmo usar la ranura. Por ejemplo, un procedimiento de tipo ifneeded (ver herencia de procedimientos) sabr como calcular el valor del atributo si no fue especificado.

Los MARCOS se adaptan muy bien a los problemas de clasificacin, de definicin de taxonomas. Las propiedades de las clases suelen ser los casos prototpicos, con lo que hay que considerar como dificultades la existencia de excepciones y las zonas grises de las taxonomas (lmites difusos entre las clases). Atributos especiales:

Instancia: relacin de un individuo con su clase (pertenencia de un individuo a una clase). Subclase: relacin de una subclase con su superclase (pertenencia de una clase a otra clase).

Estas relaciones no se pueden asimilar completamente a las de miembro y subconjunto de la teora de conjuntos debido al tratamiento de excepciones. Se puede ver la subclase como una especializacin y la instancia como una ejemplificacin. Los niveles inferiores pueden superponer (overwrite) sus propios valores sobre los heredados en las propiedades comunes. Es decir, se permite el tratamiento de excepciones pero se anula la interpretacin conjuntista. Ejemplo:
ELEFANTES color : gris ALBI instancia : ELEFANTES color: blanco

El valor blanco de ALBI predomina sobre el gris heredado de su clase. Para ilustrar estos conceptos se presenta un ejemplo de MARCOS definidos utilizando el lenguaje KEE (Knowledge Engineering Environment). SUPERCLASSES : Vehculos SUBCLASSES: (Camiones-Volcadores, Camiones-Carrozados) PERTENENCIA: (Clases-de-OBJETOSFsicos) M-SLOT: Dueo CLASE-DE-VALORES : Personas CRITERIO-HERENCIA: Prevalece-valor-particular VALOR: Desconocido M-SLOT: Peso CLASE-DE-VALORES : Naturales UNIDAD-DE-MEDIDA: Tonelada VALOR-MAXIMO: 1000 VALOR-MINIMO: 1 VALOR Desconocido P-SLOT : Mximo-Peso CLASE-DE-VALORES : Camiones VALOR-MAXIMO: 1 VALOR-MINIMO: 1 COMENTARIO: El mas pesado conocido El P-SLOT Mximo-Peso indica que la clase CAMIONES tiene una propiedad que es la de tener un nico (valor-mximo = valor-mnimo =1) camin de peso mximo. Por lo tanto, esta propiedad (atributo) no es heredada por las instancias. En el ejemplo se muestra tambin cmo se pueden definir las facetas (subranuras) en un marco. Por ejemplo, el M-SLOT Peso est definido por las facetas: CLASE-DEVALORES, UNIDAD-DE-MEDIDA, VALOR-MAXIMO, VALOR-MINIMO, VALOR. Se obtiene as una descripcin ms detallada de la ranura. Una de las intenciones de Minsky era que compartiendo los terminales entre distintos MARCOS, pudieran obtenerse distintos puntos de vista del mismo problema. Cada uno caracterizado por un marco distinto pero con acceso a los mismos datos bsicos. FRAME : CAMION-1 PERTENENCIA : (Camiones-Volcadores, OBJETOS-propiedad-de-Juan) P-SLOT: Dueo VALOR : Juan P-SLOT: Peso VALOR : 100 CAMION-1 puede verse desde el punto de vista de camiones como del de OBJETOS posedos por alguien. CAMION-1 slo hereda los M-SLOT de CAMIONES (como P-SLOT).

Herencia La herencia es el mecanismo natural de deduccin empleado en los MARCOS. Toda subclase o instancia de una clase hereda (posee) las propiedades de la clase, salvo que dicha subclase o instancia redefina a su vez una (o varias) de las propiedades. De esta manera, los MARCOS permiten tratar las excepciones. La herencia con excepciones es no monotnica. (Monotona: si una proposicin se deduce de una base de conocimientos, entonces sigue deducindose cuando se le agregan nuevas sentencias a la base).

Formas de efectivizar la herencia: mediante un procedimiento de reconocimiento en el cual se comparan dos objetos, un molde (patrn) y un dato, para inferir conclusiones. Ambos objetos pueden ser complejos y el apareo (matching) dividirse en sub tareas, cada una de las cuales compara una pieza de la estructura del molde con la correspondiente del dato. Este es el proceso de apareo en los MARCOS. Una vez que se selecciona el marco (molde) que responde a las necesidades del objetivo (dato), la actividad principal que se desarrolla es de llenar las ranuras con valores. Existen al menos tres formas de hacerlo: 1. a travs de la herencia directa del valor: todas las instancias de una clase tendrn el mismo valor para una ranura dada. Si Ladrillo-1 es una instancia del marco Ladrillo cuya forma es prisma rectangular, entonces esta forma se propaga a Ladrillo-1. 2. a travs de la herencia de un procedimiento (demon): los procedimientos sirven para calcular valores, verificar cambios, actualizaciones, etc. en una ranura particular. Estos se agregan a los

MARCOS como facetas (subranuras) de una ranura, las cuales pueden ser del tipo if-needed, ifadded, if-changed, etc. (segn el lenguaje). Si el procedimiento debe ser gatillado slo cuando se necesita conocer el valor de una ranura (la faceta adecuada ser'a if-needed). Ante la aparicin de una instancia se busca (por herencia) el procedimiento adecuado que calcule el valor necesario. Ej: En una simulacin de un sistema de transporte, si se desean manipular valores de peso, se puede agregar en la clase CAMIONES para la ranura Peso un procedimiento Clculo de peso de tipo if-needed. Este ser gatillado (por medio del mecanismo de la herencia) para cada camin particular que aparezca en el sistema y que no conozca su peso. FRAME : CAMIONES ----------- ----------- M-SLOT: Peso CLASE DE VALORES: Naturales UNIDAD DE MEDIDA: Tonelada VALOR MAXIMO: 1000 4 VALOR-MINIMO : 1 VALOR: Desconocido if-needed: Clculo-de-peso ----------- ----------Si el evento que se produce es el cambio de un valor en una ranura de una instancia entonces se deber buscar (si existe) en la jerarqua un procedimiento de tipo if-changed. A travs de la herencia de valores por defecto: todas las instancias de una clase tendrn el mismo valor para una ranura dada a menos que exista un valor predominante. Si Ladrillo-1 es una instancia del marco Ladrillo cuyo color por defecto es rojo, y Ladrillo es subclase de Bloque cuyo color por defecto es azul, entonces si se conoce el color de Ladrillo-1 (por ejemplo: gris), este mantendr su color, en caso contrario el color de Ladrillo-1 ser rojo (el ms cercano en la jerarqua). El valor por defecto tiene que ver con las expectativas o presunciones que se tengan a priori. Segn Minsky, 'este es un punto critico, ya que, as como una buena eleccin de las asignaciones por defecto permite almacenar una invalorable fuente de informacin heurstica, una mala seleccin puede llevar a formar colecciones paralizantes de prejuicios irracionales. En la prctica, estas tres vas de herencia se combinan de distintas maneras, dando lugar a diferentes estrategias, cuya aplicacin depende del conocimiento que se tenga del dominio de la aplicacin. Por ejemplo, se puede buscar primero el valor exacto, luego el valor por defecto y por 'ultimo el procedimiento. O comenzar con los procedimientos, luego los valores y al final los valores por defecto, etc.

3.5.- Desarrollo de Aplicaciones Sencillas


Problema N1: Ingresar dos nmeros, calcular el rea del cuadrado que tiene como lado el mayor, y el rea del crculo que tiene como radio al menor.
Program DosNum; UsesCrt; Var N1,N2: Real; A1,A2: Real; Begin Write(' Ingrese nmero 1 y nmero 2: '); ReadLn(N1,N2); If N1 > N2 then Begin A1:=N1*N1; A2:=3.1415 * Sqr(N2) End

Else Begin

A1:=N2*N2; A2:=3.1415 * Sqr(N1) End; WriteLn ('Area del Cuadrado : ',A1:10:2); WriteLn ('Area del Crculo : ',A2:10:2); Repeat Until KeyPressed End. Comentarios: La funcin Sqr ('Square'), es una funcin predefinida en Turbo Pascal y nos retorna el cuadrado del argumento. No hay que confundirla con la funcin SqRt ('Square Root'), la cual realiza el clculo de la raz cuadrada de su argumento. La impresin de las variables que almacenan el valor de las reas (A1 y A2) se realiza 'formateando' la salida. En este caso al especificar A1:10:2 le estamos diciendo al Turbo Pascal que visualice el valor de A1 en un campo de 10 columnas de ancho, de las cuales se utilizan 2 para la parte decimal; la plantilla sera 9999999.99. Es necesario formatear las variables reales cuando las imprimimos en una sentencia Write o WriteLn porque el Turbo Pascal, por default, visualiza el valor de las variables reales en notacin exponencial, a la cual, nosotros, estamos menos acostumbrados. La estructura Repeat Until KeyPressed es utilizada en este caso para que la visualizacin de los resultados permanezca en pantalla hasta que se pulse una tecla. KeyPressed es una variable booleana predefinida en Turbo Pascal, y toma el valor True cuando se pulsa cualquier tecla. Problema N2: Ingresar dos nmeros, los cuales constituyen las coordenadas de un punto del plano. Informar a qu cuadrante pertenece el punto y, si est en el primer cuadrante, hallar la distancia al origen..
Program Cuadrante; Uses Crt; Var X,Y,D : Real; C : Byte; Begin Write(' Ingrese coordenadas X e Y : '); Readln(X,Y); If Y>0 then If X>0 then Begin {sabemos que estamos en el primer cuadrante } C:=1; D:=SqRt(Sqr(X) + Sqr(Y)) End Else C:=2 else If X 0 then C:=3 Else C:=4; WriteLn('El punto pertenece al cuadrante: ',C); If C=1 then WriteLn(' y se halla a una distancia ', D:10:2,' del origen'); Repeat Until KeyPressed End.

Comentarios: Observar que en el programa anterior, no est contemplado el caso del origen de coordenadas; si se ingresa 0,0, el programa; por la forma en que estn estructurados los If's, informar que el punto pertenece al cuadrante 4, lo cual es incorrecto. Cmo se puede modificar el programa para que se detecte este caso particular? Se puede resolver el probleme sin crear la variable D? Se puede resolver sin crear D y C? Qu valores toma el tipo Byte en Turbo Pascal? Para este problema, es conveniente utilizarlo en lugar del tipo Integer? Problema N3: Leer un ao y determinar si es bisiesto. NOTA: un ao es bisiesto si es mltiplo de 4. Los mltiplos de 100 no son bisiestos, salvo si son tambin mltiplos de 400.
Program Bisiesto1; Uses Crt; Var A : Word; Begin Write('Ingrese ao : '); Readln(A); If A mod 4=0 then Begin If A mod 400 =0 then WriteLn('Es bisiesto'); If A mod 100 =0 then WriteLn('No es bisiesto') Else WriteLn('Es bisiesto') End Else WriteLn('No es bisiesto'); Repeat Until KeyPressed End.

Comentarios: La variable A, que almacena al valor del ao la declaramos como Word, Word se utiliza en Turbo Pascal para almacenar valores enteros en el rango 0..65535. Las variables Word ocupan dos bytes de almacenamiento, al igual que las Integer, pero recordemos que el rango de los Integer es -32768 a 32767. La funcin mod es una funcin predefinida del Turbo Pascal, que nos retorna el resto de la divisin entera entre su primer parmetro y su segundo parmetro (ambos parmetros deben ser valores enteros). La forma en que est enunciado el problema complica el planteo del mismo, y la solucin que se tiende a hallar en un primer intento, es una como la anterior (basada en una estructura IF), sin >embargo estudiando un poco la definicin de ao bisiesto podemos llegar a una expresin mnima de su definicin y a una solucin ms elegante: "Un ao ser bisiesto si es mltiplo de 400, o si es mltiplo de 4 pero no de 100" Qu valores toma el tipo Word? Para este problema, existe alguna ventaja para usarlo en lugar del tipo Integer?
Program Bisiesto2; Uses Crt; Var A : Word; EsBis : Boolean; Begin Write('Ingrese ao : '); Readln(A); EsBis:=(A mod 400=0)or((A mod 4 =0)and (A mod 100 <>0) );

If EsBis then WriteLn('Es bisiesto') Else WriteLn ('No es bisiesto'); Repeat Until KeyPressed End.

Comentarios: Usamos una variable booleana (EsBis), a la cual le asignamos el resultado de la expresin mnima antes vista. Esto hace el cdigo mas legible. Sin embargo podramos haber obtenido un programa ligeramente ms compacto, sin utilizar la variable EsBis, y reemplazando en el If la variable EsBis por el contenido de la expresin que le estamos asignando. Es equivalente usar:
If EsBis y If EsBis=True

Problema N4: Leer un texto del teclado y deducir el nmero de asteriscos de una frase dada. El caracter final del texto ser el primer punto.
Program Asteriscos; Uses Crt; Var C:Char; N:Word; Begin ClrScr; Write('Ingresar letra por letra el texto deseado (.= final)'); Read(C); N:=0; While C<>'.' do Begin If C='*' then N:=N+1; Read(C); End; WriteLn('Numero de asteriscos ingresados ',N); Repeat Until KeyPressed End.

Comentarios: Para que el programa limpie la pantalla, utilizamos como primer sentencia ClrScr (de Clear Screen), esta sentencia se halla contenida, junto con otro grupo de sentencias, en una librera que viene con el Turbo Pascal, denominada CRT (y que contiene sentencias que se encargan del manejo del monitor y los sonidos). Para que el compilador pueda reconocer estas sentencias, es necesario incluir como segunda lnea del programa la clusula Uses con el nombre de la librera. El Turbo Pascal tiene otras libreras predefinidas; las ms utilizadas son la Printer (con sentencias que se encargan del manejo de la impresora), la Graph (para el manejo del monitor en modo grfico) y la Dos (que habilita el acceso a funciones de manejo de archivos, fecha y hora). Suponemos que se puede leer un texto nulo (solo contendr el punto que indica su fin), por lo tanto utilizamos una estructura While, que es la ms adecuada a aquellas situaciones donde la/s

tarea/s a repetir (en este caso el test de si C es un asterisco, y la lectura del prximo caracter) se podr/n ejecutar 0 a n veces. Problema N5: Suponiendo que la poblacin de un pas hoy es de 40 millones y que la tasa de crecimiento anual es constante, ingresar dicha tasa y determinar el ao en el cual la poblacin supere por primera vez los 100 millones.
Program Poblacion; Uses Crt; Const PobI = 40000000.0; PobF = 100000000.0; Var T : Real; Function Anio(T:real):word; Var i:word; P:real; Begin i:=1996; P:=PobI; While PobF > P do Begin P:=P + (P*T/100); Inc(i); { es equivalente a i:=i+1 } End; Anio:=i End; Begin { Programa Principal } ClrScr; Write(' Ingrese tasa de crecimiento : '); Readln(T); WriteLn(' Ao en que se supera ',PobF:10:0,' de habitantes = ',Anio(T)); Repeat Until KeyPressed End.

Comentarios: Los valores de poblacin inicial y final los declaramos como constantes para hacer mas fcil su utilizacin en las distintas partes del programa, adems nos facilita el proceso de adaptar el programa para nuevos valores de poblacin inicial y final. PobI y PobF las declaramos como constantes REALES (por eso aparece un punto y un cero decimal). El clculo del ao en que se supera por primera vez el valor de PobF lo hacemos en una funcin desarrollada con ese propsito, lo que nos permite mantener el cdigo del programa principal en un formato absolutamente legible. La instruccin Inc que utilizamos dentro de la funcin tiene el siguiente formato general: Inc (Variable_entera, incremento) y es equivalente a:

Variable_entera:=Variable_entera + incremento Si el segundo argumento es nulo, se asume uno. El procedimiento Inc es ms eficiente que la forma tradicional, pero su uso est limitado a Variables enteras (shortint, byte, word, integer y longint). Es absolutamente esencial recordar asignar el valor correcto a la funcin, esto lo realizamos en la ltima sentencia del cuerpo de la funcin. Vemos que en el programa principal, cuando queremos visualizar el valor que nos retorna la funcin, esta se comporta exactamente como si fuera una variable del tipo que declaramos en la cabecera de la funcin (REAL). Por lo tanto no hay ningun inconveniente en utilizarla dentro del WriteLn y de aplicarle un formato de salida (por ejemplo ':10:0') de la misma forma que lo haramos con una variable real.

UNIDAD IV
4.1.- Estructura de un programa en C++
El formato general de un programa en C++ es el siguiente void main(void) funcin principal. { ......... ......... principal. ......... } <-------------linea de cabecera de la

<-------------Inicio de bloque. <------------Cuerpo de la funcin <-------------Fin de bloque.

En el listado 4.1 se muestra un programa que despliega en la pantalla del monitor el mensaje: El Lenguaje C++ es poderoso // PRIMER.CPP // // Despliega un mensaje en la pantalla. #include <stdio.h> // Para utilizar la funcin printf()

void main(void) { printf("El lenguaje C++ es poderoso\n");

} Listado 4.1.- Primer programa en C++

4.2.- Archivos de cabecera.


El listado 4.1 contiene la lnea : #include <stdio.h> En ella, stdio.h es el nombre de un archivo de cabecera en el cual se encuentran declarados los prototipos de las funciones y macros que se utilizan para la entrada/salida estndar. Existe un extenso grupo de archivos de cabecera, y cada uno de ellos sirve para manejar un grupo de funciones relacionadas. La extensin h de estos archivos es la inicial de la palabra header. Generalmente estos archivos se incluyen en las primeras lneas de los archivos que contienen el cdigo fuente de los programas en C++ . El compilador de C++ desplegar un mensaje de error cuando se trate de utilizar una funcin sin antes haber incluido el archivo de cabecera que contiene el prototipo de ella. Los archivos de cabecera son almacenados en el directorio INCLUDE cuando se instala el paquete del compilador.

4.3.- Comentarios.
En el C++ existen dos formas de manejar los comentarios:

La primera sirve para escribir comentarios que abarcan varias lneas, y utiliza los caracteres /* para marcar el inicio de un comentario, y los caracteres */ para marcar el final, como se ve en los siguientes ejemplos: /* Este es un pequeo comentario */ /* Este es otro comentario, pero a diferencia del anterior, utiliza varias lneas. Observe que tambin puede incluir lneas en blanco (como la anterior y la siguiente). */ La segunda forma solo sirve para comentarios que abarcan una lnea o parte de ella, y utiliza los caracteres // al principio del comentario. El fin del comentario queda marcado por el fin de la lnea, como se muestra a continuacin: // Este es un comentario de una lnea, // y este es otro.

void main(void)

// Este comentario ocupa parte de la lnea.

Los comentarios de una sola lnea pueden anidarse dentro de los comentarios de varias lneas, como en : /* El principio del comentario de varias lneas. // Primer comentario de una sola lnea. // Segundo comentario de una sola lnea. */ Fin del comentario de varias lneas.

4.4.1.- Diseo de funciones


Las funciones son el mdulo bsico para la construccin de programas en C++. Adems de la funcin main(), con frecuencia es necesario utilizar funciones adicionales que pueden ser accesadas a travs del enlace de libreras precompiladas a travs de su definicin en el archivo de cdigo fuente en archivos de cabecera. En esta unidad estudiaremos los procedimientos necesarios para el manejo de las funciones definidas en el cdigo fuente. En principio, debemos distinguir entre: declarar, definir e invocar una funcin, ya que la confusin de stos trminos es causa de frecuentes problemas. Desde los orgenes del Lenguaje C ha existido la distincin entre definir y declarar una funcin. Cuando se define una funcin se le est reservando espacio de almacenamiento en memoria; en cambio cuando se declara solo se est avisando que ms adelante se encuentra una funcin con ciertas caractersticas, pero no se le reserva espacio en memoria.

4.4.2.- Definicin de funciones


La definicin de una funcin implica reservarle espacio de almacenamiento en memoria, de acuerdo al tipo de dato a retornar. Es en la definicin donde se incluye el cuerpo de la funcin.

El formato general de la definicin de una funcin es el siguiente: tipo identificador( argumentos ) { bloque; } donde: tipo es el tipo de dato que va a retornar la funcin, e identificador es el nombre de la funcin.

La existencia de argumentos depender de la tarea que va a realizar la funcin, pero el par de parntesis es requisito indispensable. En el listado 4.2. se presenta una aplicacin de la definicin, la declaracin y la invocacion de funciones.

4.4.3.- Declaracin de funciones


Cuando se declara una funcin, se est avisando al compilador que ms adelante encontrar la definicion de tal funcin, y que por el momento, tome nota de las caractersticas de ella, como son: el tipo de dato que retorna, su nombre y los tipos de argumentos que va a recibir. Con esto, no habr ningn problema en invocar a la funcin en un bloque de programa ubicado antes del lugar donde se encuentra escrita su definicin. En el listado 4.2, las lneas: void saludo(); float calcula(float); representan la declaracin de las funciones la declaracin de los prototipos de las funciones saludo() y calcula(). En la declaracin de la funcin saludo() se especifica que no va a retornar valor alguno, y que no recibir argumentos. En la declaracin de la funcin calcula() se especifica que va a retornar un valor de tipo float, y que va recibir un argumento de tipo float. Es importante observar que la declaracin de una funcin es parecida a la lnea de encabezado de su definicin , slo que en el caso de la declaracin se escribe un punto y coma al final. Tambin cabe hacer notar que en la declaracin no se requiere escribir identificadores para los argumentos, como se observa en el listado 4.2, sino que basta con incluir los tipos de datos de los argumentos. Se pueden incluir identificadores de argumentos, slo que el mbito de tales identificadores estar restringido a la declaracin de la funcin correspondiente. Por lo tanto, la declaracin: float calcula(float); podra haberse escrito as :

float calcula(float arg); En este caso, el identificador arg no tiene uso alguno; por lo que es innecesaria su inclusin. Si el nmero de argumentos, o los tipos correspondientes no coinciden entre la declaracin y la lnea de encabezado de la definicin de la funcin el compilador marcar un error.

4.4.4.- Invocacin a funciones

Una invocacin llamada a una funcin implica pasarle el control de la ejecucin del programa, as como los argumentos parmetros que requiere para realizar su tarea. En el listado 4.2 se tienen las lneas: saludo(); //INVOCACION A LA FUNCION saludo() precio = calcula(costo); //INVOCACION A LA FUNCION calcula() En la primera, se invoca a la funcin saludo() y no se le pasa ningn argumento. En la segunda, se invoca a la funcin calcula(), pasndosele como argumento una copia del valor que tiene la variable costo. El valor retornado por calcula() se asigna a la variable precio. // ENCABEZADOS #include <iostream.h> #include <conio.h> // DECLARACION DE FUNCIONES void saludo(); float calcula(float); // DEFINICION DE LA FUNCION PRINCIPAL void main() { float costo, precio; clrscr(); cout << "COSTO : $ "; cin>> costo; saludo(); //INVOCACION A LA FUNCION saludo() precio = calcula(costo); //INVOCACION A LA FUNCION calcula() cout << "PRECIO : $ " << precio; } // DEFINICION DE LA FUNCION saludo() void saludo() { clrscr(); cout << "!! BIENVENIDO A LA VENTA ESPECIAL !!"; } // DEFINICION DE LA FUNCION calcula() float calcula(float x) { return( x * 1.6); } Listado 4.2.- Diseo de funciones utilizando prototipos.

4.4.5.- Prototipo de una funcin


Cuando encuentra la primera invocacin a una funcin, el compilador verifica si ya se realiz la declaracin la definicin de la funcin invocada. En caso de no existir ni declaracin ni definicin previa, enviar un mensaje de error diciendo que la funcin invocada debe tener un prototipo. En ese momento se detiene la compilacin y no se genera el archivo .OBJ correspondiente. Lo anterior puede sugerir que el prototipo de la funcin invocada es indispensable. La realidad es que se puede omitir el prototipo si escribimos la definicin de la funcin antes de su primera invocacin, como se muestra en el listado 4.3.

// ENCABEZADOS #include <iostream.h> #include <conio.h> // DEFINICION DE LA FUNCION saludo() void saludo() { clrscr(); cout << "!! BIENVENIDO A LA VENTA ESPECIAL !!"; } // DEFINICION DE LA FUNCION calcula() float calcula(float x) { return( x * 1.6); } // DEFINICION DE LA FUNCION PRINCIPAL int main() { float costo, precio; clrscr(); cout << "COSTO : $ "; cin>> costo; saludo(); //INVOCACION A LA FUNCION saludo() precio = calcula(costo); //INVOCACION A LA FUNCION calcula() cout << "PRECIO : $ " << precio; return 0; } Aunque el prototipo no es obligatorio, es recomendable utilizarlo, ya que de esta manera se permite al compilador verificar que el nmero y tipos de argumentos utilizados en la invocacin (parmetros actuales) coinciden con los de la definicin (parmetros formales). La declaracin de prototipos tambin sirve para que el usuario de un programa conozca la forma de utilizacin de la funcin, sin tener que proporcionarle el cdigo fuente. Por ejemplo, si tenemos un programa que maneja operaciones matemticas podemos distribuir a los usuarios el cdigo objeto que contenga las definiciones de las funciones y un archivo de cabecera que contenga los prototipos. Los archivos pudieran tomar la forma mostrada a continuacin: ARITME.OBJ Archivo que contiene el cdigo objeto, donde se definen las funciones aritmticas.

//ARITME.HPP: CONTIENE LOS PROTOTIPOS DE LAS FUNCIONES double suma(double,double); double resta(double,double); ........................... ........................... //APLICA.CPP: PROGRAMA FUENTE ELABORADO POR // EL USUARIO #include <iostream.h> #include "ARITME.HPP" //Incluye el archivo que contiene

//los prototipos de las funciones //aritmticas void main(void) { double result, a=13500.45, b=16763.87; result = suma(a,b); // Invocacin a la funcin suma() // definida en ARITME.OBJ cout << result; } Este es el criterio que se sigue al utilizar los archivos de cabecera que contiene el paquete compilador. Por ejemplo, cuando se escribe la lnea: #include <stdio.h> se est incluyendo el archivo que contiene los prototipos de las funciones que se utilizan para el manejo de la entrada/salida estndar.

4.5.- Palabras reservadas


Las palabras reservadas, como su nombre lo indica, son identificadores que tienen asignado un uso especfico y no podrn ser utilizadas como identificadores creados por el usuario. La tabla 4.1 muestra las palabras reservadas de Borland C++ _asm + asm auto break case @ _cdecl @ cdecl char + class const continue @ _cs default + delete do double @ _ds else enum @ _es @ _export extern @ _far @ far @ _fastcall float for + friend goto _huge @ huge if + inline int _interrupt @ interrupt @ _loadds long @ _near @ near + new + operator @ _pascal @ pascal + private + protected + public register return @ _saveregs @ _seg short signed sizeof @ _ss static struct switch + template + this typedef union unsigned + virtual void volatile while

Tabla 4.1.- Palabras reservadas de Borland C++. Las palabras marcadas con + en la tabla 4.1 son las palabras reservadas especficas de C++, las marcadas con @ son las palabras aadidas por Borland al C, y las palabras sin marca son las palabras reservadas del C estndar.

4.6.- Presentacin de las Clases y de los Objetos


4.6.1.- Definicin de clases
La definicin de la clase punto en C++ puede tomar la siguiente forma : class punto { int x,y ; // MIEMBROS DATO } ; Aqu no se est haciendo uso del encapsulamiento, puesto que no se ha declarado ninguna funcin miembro dentro de la clase punto.

4.6.2.- Derivacin de clases


La derivacin de clases en C++ se rige por la siguiente sintaxis : class derivada : modificador_de_acceso { ..... ..... } base

modificador_de_acceso es opcional y puede ser public o private.

4.6.3.- Ambito de clase


El trmino mbito se refiere al rea dentro de un programa donde un identificador dado es accesible. Para controlar la manera en que son accesados los miembros de las clases, C++ ha introducido el concepto de mbito de clase . Todos los miembros de una clase estn en el mbito de esa clase, de manera que cualquier miembro de una clase puede referenciar a cualquier otro miembro de la misma clase. Las funciones miembro de una clase tienen acceso irrestricto a los miembros dato de esa misma clase. El acceso a los datos y funciones miembro de una clase exterior al mbito de la clase es controlado por el programador a travs de los especificadores de acceso.

4.6.4.- Manejo de clases en mdulos


Las clases pueden empacarse en mdulos para su utilizacin posterior en el desarrollo de programas. Una clase es inherentemente modular con sus miembros dato, funciones miembro y control de acceso. En el desarrollo de un programa, a veces tiene sentido poner las declaraciones, para cada clase o grupo relacionado de clases, por separado en un

archivo de cabecera; y en otro las definiciones para las funciones miembro que no estn en lnea. En el listado 4.5 se presenta el archivo de cabecera PIXEL.H , donde, a partir de la clase base punto, se deriva otra clase llamada pixel que nos servir para visualizar u ocultar puntos en cualquier lugar de la pantalla.

//////////////////////////////////////////////////////////////////////////// // PIXEL.H : CONTIENE LAS CLASES : // // // // // // // // pixel MANEJA LA VISIBILIDAD DE UN PUNTO EN // // LA PANTALLA. ///////////////////////////////////////////////////////////////////////// enum booleano { falso, verdadero } ; class punto { protected: int x , y ; public: //LAS SIGS.FUNCIONES PUEDEN ACCESARSE DESDE //EL EXTERIOR. punto QUE MANEJA LA LECTURA Y COLOCACION DE UN PUNTO. // //

//PERMITE QUE LAS CLASES DERIVADAS HEREDEN //DATOS privados.

punto(int nx, int ny) ; int dax(); int day(); }; // CLASE DERIVADA DE punto. LA DERIVACION public SIGNIFICA // QUE x , y ESTARAN PROTEGIDAS DENTRO DE pixel. class pixel : public punto { protected: //LAS CLASES DERIVADAS DE pixel NECESITAN //ACCESO A ESTOS MIEMBROS DATO. booleano visible ; public: pixel(int nx, int ny); // CONSTRUCTOR void mostrar(); void ocultar(); boleano es_visible(); void mover_hacia(int nuevax, int nuevay); };

Ntese la utilizacin de protected en lugar de private para ciertos elementos, con lo que se hace posible la utilizacin del archivo PIXEL.H en aplicaciones que manejen clases derivadas de punto y pixel. Las definiciones para las funciones miembro de las clases punto y pixel se almacenan en el archivo PUNTO2.CPP.

////////////////////////////////////////////////////////////////////////////// // PUNTO2.CPP : CONTIENE LA DEFINICION PARA LAS FUNCIONES // // MIEMBRO DE LAS CLASES punto y pixel ////////////////////////////////////////////////////////////////////////////// #include "pixel.h" #include <graphics.h> // DEFINICION DE LAS FUNCIONES MIEMBRO PARA LA CLASE punto punto::punto(int nx , int ny) { x = nx ; y = ny ; }; int punto::dax(void) { return x ; }; int punto::day(void) { return y ; }; // DEFINICION DE LAS FUNCIONES MIEMBRO PARA LA CLASE pixel pixel::pixel(int nx, int ny) : punto(nx,ny) { visible = falso ; }; void pixel::mostrar(void) { visible = verdadero ; putpixel(x,y, getcolor()); // USA EL COLOR PREDEFINIDO. // SUPONE QUE EN main() SE // INICIALIZAN LOS GRAFICOS. }; void pixel::ocultar(void) { visible = falso ; putpixel(x,y,getbkcolor()); // USA EL COLOR DEL FONDO. }; booleano pixel::es_visible(void) { return visible ; }; void pixel::mover_hacia(int nuevax, int nuevay) { ocultar(); // HACE INVISIBLE AL PUNTO ACTUAL x = nuevax ; // CAMBIA LAS COORDENADAS x,y . y = nuevay ; mostrar(); // MUESTRA EL PUNTO EN LA NUEVA LOCALIDAD. };

Observe que, para definir el constructor de la clase derivada, se hace referencia al constructor de la clase base como en : pixel::pixel(int nx,intny) : punto(nx,ny)

Esto significa que, para construir un objeto de la clase pixel, primero se invoca al constructor de la clase base punto con los argumentos nx y ny creando e inicializando los miembros dato x,y. Posteriormente se invoca al constructor pixel, creando e inicializando el miembro dato visible. Note que la referencia al constructor de la clase base aparece en la definicin, no en la declaracin, del constructor de la clase derivada. Si no se ha definido un constructor para una clase x, el C++ generar un constructor predefinido de la forma : x::x(); esto es, un constructor sin argumentos.

El listado 4.7 contiene un programa que muestra la utilizacin de la clase pixel .


///////////////////////////////////////////////////////////////////////////// // PIXEL.CPP : APLICACION ELEMENTAL DE LA CLASE pixel // // ////////////////////////////////////////////////////////////////////////////// #include <graphics.h> #include <conio.h> #include "pixel.h" int main() { // INICIALIZACION DEL SISTEMA DE GRAFICOS int manej = DETECT, modo ; initgraph ( &manej, &modo, "c:\\borlandc\\bgi"); // ENCIENDE, CAMBIA Y APAGA PIXELES pixel unpixel(100,50) ; // DEFINE unpixel CON VALORES // INICIALES x=100, y=50 unpixel.mostrar(); // unpixel SE ENCIENDE getch() ; // ESPERA UNA PULSACION DE TECLA unpixel.mover_hacia(300,150); // MUEVE unpixel A 300,150 getch(); unpixel.ocultar(); // OCULTA A unpixel getch(); closegraph(); return 0 ; }

Como podr observarse, no se ha incluido el archivo PUNTO2.CPP, por lo que este programa deber compilarse utilizando la opcin PROJECT del Ambiente Integrado de Desarrollo ( IDE ) del C++ de Borland, creando un archivo de proyecto PIXEL.PRJ que incluya los archivos GRAPHICS.H, PUNTO2.CPP y PIXEL.CPP . Uno de los atractivos de las clases es que pueden utilizarse para construir otras clases que respondan a las necesidades de una nueva aplicacin. En el ejemplo que se muestra en el listado 4.8 se hace uso de la clase pixel para derivar una nueva clase llamada circulo, la cual contendr funciones miembro para mostrar, ocultar, mover, expander y contraer circulos.

////////////////////////////////////////////////////////////////////////////// // CIRCULO.CPP : MANEJO DE LA CLASE circulo DERIVADA DE LA // // CLASE pixel ////////////////////////////////////////////////////////////////////////////// #include <graphics.h> #include <conio.h> #include "pixel.h" class circulo : pixel { int radio ; // DERIVADA PRIVADAMENTE DE pixel

public: circulo(int nx, int ny, int nradio); void mostrar(void); void ocultar(void); void expander(int cantexp); void contraer(int cantcont); void mover_hacia(int nvax, int nvay); }; circulo::circulo(int nx,int ny,int nradio) : pixel(nx,ny) { radio = nradio; }; void circulo::mostrar(void) { visible = verdadero; circle(x,y,radio); // DIBUJA EL CIRCULO }; void circulo::ocultar(void) { unsigned int colortemp ; colortemp = getcolor(); setcolor(getbkcolor()); visible = falso ; circle(x,y,radio); setcolor(colortemp); }; void circulo::expander(int cantexp) { ocultar(); // BORRA EL CIRCULO ACTUAL radio += cantexp; // EXPANDE EL RADIO if( radio <0 ) // EVITA RADIOS NEGATIVOS radio="0" ; mostrar(); // DIBUJA EL NUEVO CIRCULO }; void circulo::contraer(int cantcontr) { expander(-cantcontr); }; void circulo::mover_hacia(int nvax, int nvay) { ocultar(); // BORRA EL CIRCULO ACTUAL x="nvax" ; // ASIGNA NUEVAS COORDENADAS y="nvay" ; mostrar(); // DIBUJA EL CIRCULO EN LA NUEVA POSICION }; void main() { int manej="DETECT" , modo ; initgraph(&manej, &modo, "c:\\borlandc\\bgi"); circulo uncirculo(100,200,50); uncirculo.mostrar(); getch();

// PARA GUARDA EL COLOR ACTUAL // GUARDA EL COLORR ACTUAL // CAMBIA AL COLOR DEL FONDO // DIBUJA EL CIRCULO CON EL COLOR // DEL FONDO PARA BORRARLO // RESTABLECE EL COLOR ORIGINAL

uncirculo.mover_hacia(200,250); getch(); uncirculo.expander(50); getch(); uncirculo.contraer(75); getch(); closegraph(); }

4.6.5.- Objetos dinmicos


En los ejemplos mostrados anteriormente se utilizaron objetos cuyo espacio de almacenamiento se manej en la pila. En esta seccin trataremos con objetos dinmicos, cuyo espacio de almacenamiento en el montculo se asigna y se libera en tiempo de ejecucin por medio de los operadores new y delete. Por ejemplo, si existe una clase llamada punto, podemos escribir: punto* ap ; ap = new punto(10,20); En la primera lnea se est declarando un apuntador llamado ap, que servir para apuntar a objetos de clase punto . En la segunda lnea se gestiona un bloque de memoria lo suficientemente grande para almacenar un objeto de la clase punto, se invoca al constructor punto pasndole los argumentos 10,20 . La direccin de inicio del bloque gestionado se asigna al apuntador ap. Las dos lneas anteriores pueden sustituirse por: punto* ap = new punto(10,20); En el listado 4.9 se presenta un ejemplo del manejo de dos objetos dinmicos, donde, adems, se utiliza el polimorfismo. En 4.9 puede observarse que se declara el apuntador ap para que apunte a objetos de clase numero y, sin embargo, ese mismo apuntador se utiliza para apuntar a objetos de clase division. Esto se debe a que, en C++, un apuntador declarado para apuntar a objetos de una clase base puede utilizarse para apuntar a objetos de una clase derivada. Esta regla no es vlida en el sentido inverso; esto es, un apuntador declarado para apuntar a objetos de una clase derivada no puede utilizarse para apuntar a objetos de la clase base, por lo que: division* ap; ap = new numero(10);

produce un error.
////////////////////////////////////////////////////////////////////////////// // OBJDIN.CPP : Muestra el uso de objetos dinmicos. // ////////////////////////////////////////////////////////////////////////// #include <iostream.h> class numero { protected: int valor; public: numero(int numdado) { valor = numdado;} virtual int davalor(){return valor;} }; class division : public numero { protected: int divisor; public: division(int d, int n) : numero(d) {divisor=n;} virtual int davalor() {return valor/divisor;} }; void main() { numero* ap; ap = new numero(15); cout << ap->davalor() << '\n'; delete ap; ap="new" division(15,2); cout << ap->davalor() << '\n'; } //Despliega 15 // Despliega 7

4.7.- Sobrecarga de funciones


En la mayora de los casos, los identificadores nombres de los objetos deben ser nicos, esto es, que dos objetos dentro del mismo mbito no deben tener el mismo nombre. Una de las excepciones la constituyen las funciones, que pueden compartir el mismo nombre entre varias de ellas, dando la impresin de que a una sola funcin se le ha "sobrecargado de tareas", razn por la cual se les llama funciones sobrecargadas. Por ejemplo, supongamos que deseamos una funcin que sirva para sumar nmeros. Lo ideal sera contar con una sola funcin que realizara la suma de nmeros de diferentes tipos y que retornara un valor de acuerdo al tipo de resultado. El Lenguaje C++ permite resolver este problema por medio de la sobrecarga de funciones. A continuacin se muestran los prototipos para cada una de las funciones que comparten el nombre suma :
int float suma(int,int); suma(float,float); // Recibe enteros, devuelve entero

double suma(double,double);

Aqu surge la pregunta: cmo distingue el compilador entre cada una de las funciones suma() ?. Debido a que varias funciones sobrecargadas pueden usar el mismo identificador, C++ utiliza el concepto de nombres ampliados para controlar cada funcin individualmente. El nombre ampliado de una funcin se construye tomando como base el nombre de la funcin y los tipos de los argumentos. El tipo de retorno de la funcin no se utiliza en la formacin del nombre ampliado. La composicin del nombre ampliado ocurre a nivel del compilador, no al nivel del enlazador. El enlazador resuelve fcilmente las referencias externas para sobrecargar las funciones debido a que stas tienen nombres ampliados nicos. Las reglas bsicas usadas en Borland C++ para los nombres ampliados son relativamente simples como se observa a continuacin : 1. Se utiliza primero el nombre de la clase, precedido por el carcter @. 2. Enseguida viene el nombre de la funcin, precedido por el carcter @. 3. Si la funcin no es parte de una clase, el nombre ampliado empieza con el smbolo @ seguido por el nombre de la funcin. Se respetan las reglas establecidas para la creacin de identificadores. 4. El nombre de la funcin est seguido por una secuencia $q ; las letras minsculas que le siguen designan cada tipo de argumento declarado. La tabla 4.2 muestra una lista de las letras que se utilizan para manejar los tipos predefinidos de C++ en la formacin de los nombres ampliados.
Tipo de argumento Letras void void* unsigned char unsigned char* unsigned char& signed char signed char* signed char& int int* int& unsigned int unsigned int* unsigned int& long long* long& unsigned long unsigned long* unsigned long& float float* float& double double* v pv uc puc ruc zc pzc rzc i pi ri ui pui rui l pl rl ul pul rul f pf rf d pd

double&

rd

Utilizando la tabla 4.2, se pueden predecir fcilmente los nombres ampliados de las funciones, como se muestra a continuacin:
Declaracin de funciones void imprim(void); void imprim(int); void imprim(int,int,int); void despliega(char*); int suma(int,int); float suma(float,float); Nombre ampliado @imprim$qv @imprim$qi @imprim$qiii @despliega$qpzc @suma$qii @suma$qff

int redim(long,unsigned int*); @redim$qlpui

double suma(double,double); @suma$qdd

4.8.- Sobrecarga de Operadores


Los objetos que se manejan en C++ van a tener un tipo de dato asociado, el cual determina la cantidad de espacio de almacenamiento que se le asigna a cada uno de los objetos de tal tipo, as como el conjunto de operaciones que podrn realizarse con los valores almacenados. Las operaciones sern representadas a travs de identificadores especficos llamados operadores. En esta seccin estudiaremos los operadores, agrupndolos en:

4.8.1.- Operadores arimticos


Los operadores aritmticos se aplican sobre objetos con valores numricos, como se muestra en la tabla 2.2 . Sean: X = 20 , Y = 30 , A = 100.0 , B = 200.0
Operador + * / % ++ Operacin Adicin Sustraccin Multiplicacin Divisin Mdulo Incremento Decremento Ejemplo Resultado Z=X+Y Z=Y-X Z=X*Y Z=Y/X Z=Y%X X++ XZ=50 Z=10 Z=600 Z=1.5 Z=10 X=21 X=19

4.8.2.- Operadores relacionales


Los operadores relacionales se usan para comparar los valores que resultan de reducir expresiones. Los resultados coincidirn con los valores de verdad: FALSO igual a CERO VERDADERO diferente de CERO Los operadores relacionales en C++ son :

> >= <= <= = !=

Mayor que Mayor igual que Menor igual que Menor o igual que Igual que Diferente que ( No igual que )

4.8.3.- Operadores lgicos


Los operadores lgicos se aplican sobre los enunciados que resultan de las operaciones relacionales, y el resultado siempre ser un valor de verdad. Los operadores lgicos son:
&& || ! Y O NO ( Conjuncin ) ( Disyuncin ) ( Negacin )

4.8.4.- Operadores entre bits


Con estos operadores se puede realizar la comprobacin, colocacin desplazamiento de los bits actuales de una variable de los tipos int y char. Los operadores entre bits son:
& | ^ ~ >> Y O O ( Conjuncin ) ( Disyuncin ) ( Disyuncin Exclusiva XOR )

( Complemento a uno NOT ) ( Desplazamiento a la DERECHA )

<< ( Desplazamiento a la IZQUIERDA )

A continuacin se presentan ejemplos de algunas operaciones entre bits: Ejemplo Supongamos que se quiere cambiar el bit de paridad ( el de la extrema izquierda ) de uno a cero. Para esto puede utilizarse la operacin de conjuncin entre bits. Si tenemos la declaracin: char indice = 81 ; y, suponiendo que se quiere cambiar el bit de paridad de 1 a 0 , la instruccin en C++ se escribira :

indice & 127 ; La operacin realizada a mano es : 01111111 11010001 <------ indice operador> & <------ 127 en binario 01010001 <------ resultado

En este caso se utiliz el nmero 127 porque es el nico nmero entero que puede escribirse en un octeto (byte) y que tiene los siete primeros bits con valor 1 . Ejemplo Se requiere que en el nmero 112 tengan valor 1 los bits que correspondan con los del nmero 7 que tengan valor 1. En este caso, la operacin a utilizar es la disyuncin entre bits, quedando las instrucciones en la siguiente forma: char masc ; masc = 112 | 7 ; La operacin manual tomara la siguiente forma: operador> resultado | 00000111 01110000 <------ 7 <-----112 en en binario 01110111 binario <------

Ejemplo La disyuncin exclusiva sirve para poner a uno los bits del primer operando cuyos correspondientes bits en el segundo operando sean distintos, como se ve a continuacin: x = 125 ^ 120 ; char x ; Manualmente se tendra: operador> resultado 01111101 <------125 en binario 01111000 <------- 120 en binario 00000101 <-------

Los operadores de desplazamiento mueven todos los bits, de una variable entera de carcter, hacia la izquierda hacia la derecha.

A medida que los bits son desplazados hacia un extremo, los lugares desocupados del estremo contrario van siendo ocupados por ceros. Los unos que salen por los extremos no se pueden recuperar(no hay rotacin) .

4.8.5.- Operadores de asignacin


El estudio de los operadores de asignacin requiere del conocimiento de los conceptos de valor izquierdo ( lvalue ) y de valor derecho ( rvalue ). Un valor izquierdo es una expresin que designa un objeto. Las expresiones utilizadas

como valor izquierdo corresponden a objetos cuyos valores pueden cambiar durante la ejecucin de un programa. Generalmente, en la expresin correspondiente a un valor izquierdo aparece el identificador de una variable. Cuando el valor izquierdo se refiere a la direccin de una variable, la expresin puede constar de una combinacin de varios identificadores. Un valor derecho es una expresin formada por cualquier combinacin de objetos y operadores que pueda ser reducida a un valor. Los operadores de asignacin sirven para asignar un valor derecho a un valor izquierdo, y estn formados por la combinacin del operador de asignacin simple = con otro operador, como se muestra en la tabla 4.3 .
Operador Significado = += -= *= /= %= <<= >>= &= ^= |= Asignacin mltiple Suma asigna Resta asigna Divide asigna Residuo asigna Dezplaz. izq. asigna Dezplaz. der. asigna Conj. e/bits asigna Disy. exclu. asigna Disyuncin asigna Ejemplo: Equivale a: . X+=Y X-=Y X/=Y X%=Y X<<Y X>>Y X&=Y X^=Y X|=Y X=X+Y X=X-Y X=X*Y X=X/Y X=X%Y X=X<<Y X=X>>Y X=X&Y X=X^Y X=X|Y

Multiplicacin asigna X*=Y

Los operadores estudiados hasta aqu no son todos los que existen en el C++, sino los que a mi juicio son indispensables para iniciar el estudio del lenguaje. Si, posteriormente, es necesario utilizar algn operador no tratado en esta unidad, en ese momento se estudiarn las caractersticas particulares de tal operador.

4.9.- Herencia
En la Programacin Orientada a Objetos, la herencia es un concepto semejante al de la herencia gentica que se d en la naturaleza. En el reino animal, por ejemplo, podemos hablar de una clase base llamada aves, cuyos miembros poseen: - plumas - alas - pico Sin embargo, no todas las aves son iguales, por lo que se tiene que recurrir a las clases derivadas para distinguir unas aves de otras, Cada una de las clases derivadas conserva las caractersticas de la clase base aves, pero posee algunas otras que la distingue de las dems clases. Hasta aqu, hemos hablado solamente de clases de aves no de las aves en s. No nos hemos referido a ninguna ave en particular, por lo que pudieramos decir que hemos

estado

hablando

de

los

"tipos

de

aves".

Una vez que se tienen los tipos, podemos llevar a cabo la construccin de aves. Cuando tales aves hayan cumplido su misin, podremos destruirlas. Esto ltimo puede parecer demasiado cruel en el mundo animal, pero en el caso de la Programacin Orientada a Objetos es lo ms prctico, pues resultara un gasto innecesario de memoria el conservar los objetos que ya no van a utilizarse . Las clases, al ser consideradas como tipos, pueden utilizarse para construir bloques de programa. Si un tipo no cumple con las especificaciones de un nuevo programa, se puede utilizar para crear otro nuevo. Este nuevo tipo se modifica para usarse en la elaboracin de nuevos objetos, y a su vez queda disponible para elaborar otros tipos, segn se necesite. Es en esta creacin de nuevos tipos donde se llega a la utilizacin de los modelos jerrquicos de clasificacin. En C++, la herencia se maneja por medio de la derivacin de clases. Herencia Mltiple Todos los lenguajes de Programacin Orientada a Objetos manejan la herencia en la forma que hemos visto hasta aqu, donde cada clase derivada tiene slo una clase base. Sin embargo, algunos de ellos permiten manejar lo que se llama herencia mltiple, en la cual se permite que una clase derivada pueda tener varias clases base. El mecanismo de herencia mltiple fu una de las principales caractersticas aadidas a la versin 2.0 de C++. Como un ejemplo del manejo de la herencia mltiple, consideremos el problema de tener que desplegar texto dentro de un crculo. Al principio podemos estar tentados a aadir una cadena de caracteres como miembro dato a la clase circulo y despus agregarle cdigo a circulo::mostrar para que despliegue el circulo con texto adentro. Pero el texto y el crculo son dos cosas diferentes. Cuando se piensa en texto, se piensa en tamaos y tipos de caracteres y en otros atributos que nada tienen que ver con los crculos. Sin embargo, podemos derivar una nueva clase directamente de la clase circulo y de otra clase que permita darle capacidad de manejar texto. EJEMPLO:
//////////////////////////////////////////////// // MULTI.CPP : ILUSTRA LA HERENCIA MULTIPLE // //////////////////////////////////////////////// #include #include #include #include <graphics.h> <conio.h> <string.h> "pixel.h"

class circulo : public pixel {

protected: int radio; public: circulo(int nx, int ny, int nradio) ; void mostrar(void); }; class mensaje : public punto // DESPLIEGA UN MENSAJE { char *mens ; int fuente ; int campo ; // MENSAJE A DESPLEGAR // FUENTE A UTILIZAR // TAMAO DEL CAMPO PARA EL TEXTO

public: mensaje( int mensx, int mensy, int mensf, int mensc, char *texto ); void mostrar(void); // MUESTRA EL MENSAJE }; class multi : circulo, mensaje // HEREDA DE AMBAS { // CLASES. public: multi(int mcircx, int mcircy, int mcircr, int fuente, char *mens); void mostrar(void); // MUESTRA CIRCULO CON MENSAJE }; // DEFINICION DE LAS FUNCIONES MIEMBRO PARA LA CLASE circulo circulo::circulo(int nx,int ny, int nradio) : pixel(nx,ny) { radio = nradio ; }; void circulo::mostrar(void) { visible = verdadero ; circle(x,y,radio) ; // DIBUJA EL CIRCULO }; // DEFINICION DE LAS FUNCIONES MIEMBRO PARA LA CLASE mensaje mensaje::mensaje(int mensx, int mensy, int mensf, int mensc, char *texto ) : punto(mensx,mensy) { fuente = mensf ; campo = mensc ; mens = texto ; // APUNTA A MENSAJE }; void mensaje::mostrar(void) { int tam = campo / ( 8 * strlen(mens)) ; // 8 PIXELES POR // CARACTER settextjustify(CENTER_TEXT, CENTER_TEXT);// CENTRA TEXTO settextstyle(fuente, HORIZ_DIR, tam) ; //AGRANDA SI tam >1 outtextxy(x,y, mens) ; // DESPLIEGA MENSAJE }; // DEFINICION DE LAS FUNCIONES MIEMBRO PARA LA CLASE multi multi::multi(int mcircx, int mcircy, int mcircr, int fuente, char *mens) : circulo(mcircx, mcircy, mcircr) , mensaje(mcircx, mcircy, fuente, 2*mcircr, mens) {

}; void multi::mostrar(void) { circulo::mostrar(); mensaje::mostrar(); }; // DEFINICION DE LA FUNCION PRINCIPAL void main() { int manej = DETECT, modo ; initgraph(&manej, &modo, "c:\\borlandc\\bgi"); multi uno(250,100,25,SANS_SERIF_FONT,"Tu"); uno.mostrar(); multi dos(250,150,100,TRIPLEX_FONT,"Tierra"); dos.mostrar(); multi tres(250,250,225,GOTHIC_FONT,"Universo"); tres.mostrar(); getch(); closegraph(); }

4.10.- Construtores y Destructores


Los constructores y los destructores son dos tipos especiales de funciones miembro. Un constructor especifica la manera en que ser creado e inicializado un nuevo objeto de cierta clase. Los constructores en C++ pueden ser definidos por el usuario generados por el lenguaje. El compilador de C++ invoca automticamente al constructor apropiado cada vez que se defina un nuevo objeto. Esto puede ocurrir en una declaracin de datos, cuando se copia un objeto o a travs de la asignacin dinmica de memoria a un nuevo objeto por medio del operador new. Para aadir un constructor a la clase punto escribimos :
class punto { int x,y ; int dax() { return x ; } int day() { return y ; } punto(int nx, int ny) ; // DECLARACION DEL CONSTRUCTOR }; punto::punto(int nx, int ny) // DEFINICION DEL CONSTRUCTOR { x = nx ; y = ny ; }

Destructores Los destructores destruyen a los objetos creados, liberando la memoria asignada. Pueden ser invocados explcitamente por medio del operador delete.

Siguiendo con el ejemplo de la clase punto :


class punto { int x,y ; int dax() { return x ; } int day() { return y ; } punto(int nx, int nx) ; ~punto() ; // DECLARACION DEL DESTRUCTOR }; punto::punto(int nx, int nx) { x = nx ; y = ny ; } punto::~punto() // DEFINICION DEL DESTRUCTOR { delete x ; delete y ; }

UNIDAD V
5.1.Delphi Visual de Desarrollo como Sistema

En programacin, nos encontraremos con 2 tipos de lenguajes, el de "Bajo" y el de "Alto" Nivel, se diferencian en lo proximos que esten al lenguaje maquina, entre los lenguajes de bajo nivel encontramos al Ensamblador, Delphi realmente no es un lenguaje, sino la IDE (Integrated Development Environment), osea el espacio de trabajo para Object Pascal, el cual es un lenguaje de programacion de alto nivel, Object Pascal como su nombre indica es Pascal orientado a objetos, un objeto es una coleccion independiente de estructuras, una clase alberga las estructuras de datos y rutinas de un objeto, en el caso de Delphi, los objetos se comunican mediante mensajes, asi pues cuando pulsamos con el raton sobre un boton, se produce un mensaje el cual desencadena un evento.

5.2.a Eventos

Programacin

Orientada

Un form que contenga los componentes nacesarios con sus correspondientes propiedades establecidas correctamente, nos ser de poca utilidad si no tenemos algo ms. Una interfaz por s sola no tiene finalidad alguna ya que aunque el usuario puede interactuar con el form y sus componentes, nuestro programa no har nada a no ser que nosotros escribamos algo de cdigo. El cdigo de una aplicacin Delphi habitualmente siempre est asociado a eventos, de tal forma que su ejecucin no se produce de forma secuencial, desde el principio hasta el fin del programa. Un evento es una seal, externa o interna a la aplicacin, que nuestro programa puede aprovechar para ejecutar un cierto bloque de cdigo, el cual escribiremos en un mtodo. El nombre y parmetros de estos mtodos estn predeterminados por Delphi, de tal forma que si deseamos responder a un evento tan slo hemos de escribir el cdigo que queremos ejecutar. Slo existe un evento por defecto para cada componente, por lo que para acceder al resto de eventos tendremos que utilizar la pgina Events del Inspector de objetos. Al abrirla podremos ver el nombre de todos los eventos posibles para el componente seleccionado en ese momento. Realizando un doble clic sobre la columna derecha de un evento, en la ventana de cdigo aparecer el mtodo de respuesta correspondiente, en el que podremos insertar las sentencias que deseemos.

Aunque inicialmente es posible crear un mtodo de respuesta distinto para cada evento, en caso de que el cdigo a ejecutar sea el mismo, Delphi nos permite que mltiples eventos compartan un solo mtodo de respuesta. Para conseguir esto, primero tendremos que crear dicho mtodo, realizndose un doble clic a la derecha del primer evento que vayamos a agrupar. En la ventana de cdigo podemos entonces introducir las sentencias que necesitemos. Hecho esto no tenemos mas que seleccionar el segundo evento, pulsando sobre su nombre, y abrir la lista desplegable de mtodo mediante la flecha que aparece en la columna derecha. En esta lista seleccionaremos el mtodo correspondiente, que quedar as asociado tambin a este evento. El proceso lo podemos repetir tantas veces como sea necesario, asociando mltiples eventos a un solo mtodo. Para modificar el cdigo de un mtodo de respuesta a un evento, suponiendo que ste no est visible en ese momento en la ventana de cdigo, bastar con realizar un doble clic en la columna derecha del evento en cuestin para que el cursor se desplace hasta el cuerpo de dicho mtodo. Al igual que ocurre con cualquier procedimiento, los mtodos de respuesta a eventos tambin pueden recibir parmetros de distintos tipos. El nmero y tipo de los parmetros a recibir dependern directamente del evento del que se trate.

5.3.- Formularios y Componentes


Un componente es una pieza binaria de software independiente, que realiza cierta funcin especifica predefinida, como una etiqueta de texto, un control de edicin o un cuadro de lista. Permite albergar en su interior otros componentes. Aunque el form en s dispone ya de una cierta funcionalidad, realmente su utilidad la obtendremos cuando en l insertemos otros componentes que nos sirvan para mostrar o solicitar informacin al usuario del programa. Este proceso, en el cual los componentes se van situando en el form y se van modificando segn las necesidades, es el diseo de la interfaz de nuestra aplicacin. Durante la etapa de diseo de la interfaz, las propiedades de un objeto pueden ser consultadas y modificadas mediante el Inspector de Objetos. Bsicamente, el Inspector de objetos est compuesto de una cabecera, en la que aparece el nombre del tipo del objeto que se est inspeccionando en ese momento, y dos pginas, una donde aparecen las propiedades y otra correspondiente a los eventos. En la pgina de propiedades nos encontramos con dos columnas, conteniendo la izquierda el nombre de la propiedad y la derecha su valor actual. Existen ciertas propiedades que slo son accesibles durante el diseo, mientras que otras slo lo son durante la ejecucin del programa. El mtodo de modificacin de una propiedad en tiempo de diseo depender directamente del tipo de la propiedad, que al igual que una variable puede contener una cadena, un nmero, una numeracin, etc. Adems una propiedad tambin puede ser un objeto, que a su vez contenga sus propiedades particulares. Para modificar el valor de una propidad simple, que contiene una cabecera o un nmero, bastar con pulsar sobre el nombre o el valor actual. Al hacerlo veremos que automticamente se marca el contenido actual. Otras propiedades slo pueden tomar un valor de una lista predeterminada, que podemos abrir pulsando sobre la flecha hacia abajo que aparecer al seleccionar dicha propiedad. Un tercer tipo de propiedad la componen aquellas que contiene otras propiedades y a las que por tanto se pueden llamar propiedades compuestas. Estas tienen un valor que aparece como si fuese una cadena de caracteres, pero que en realidad no podremos modificar directamente. Si nos

fijamos, a la izquierda del nombre de la propiedad aparece un signo +, lo que indica que esta propiedad es una propiedad compuesta. Realizando un doble clic sobre el nombre conseguiremos desplegar su contenido, teniendo acceso a las propiedades que la componente y pudiendo modificar su valor por alguno de los mtodos anteriores. Podemos volcer a cerrar el contenido de una propiedad compuesta de la misma forma, realizando un doble clic sobre el nombre. Adems de los tres tipos anteriores de propiedades, nos podemos encontrar con casos particulares en los cuales, para editar el valor de la propiedad, se facilita algn tipo de herramienta adicional a la que llamaremos editor de propiedad.

5.4.- La Interfaz Grfica: Formularios y Componentes


Para ver comoestan estrechamente ligados los formularios y los componentes para desarrollar una interfaz grafica se muestran a continuacin un ejemplo para realizar una sencilla aplicacin que muestra los fundamentos. El objetivo de este ejemplo es, simplemente, experimentar con las propiedades necesarias para tener un botn por defecto que se accione al pulsar la tecla 'Enter' y un botn de cancelar por defecto al pulsar la tecla 'Esc'. A continuacin, ponemos nombres a los controles que acabamos que crear, modificando el contenido de la propiedad 'Name'. Yo he puesto como Name para el campo de edicin 'QueBoton', para el botn de 'Aceptar', 'BAceptar, para el botn de 'Cancelar', 'BCancelar', y para el botn de 'Salir', 'BSalir'. En el evento 'OnClick' del botn de 'Salir' he puesto 'Close;', para que cierre la aplicacin. 'BAceptar' tiene el valor 'True' en la propiedad 'Default': esto significa que es el botn por defecto, y si pulsamos la tecla 'Enter' se ejecutar la accin definida en su evento 'OnClick'. 'BCancelar' tiene el valor 'True' en la propiedad 'Cancel': esto significa que es el botn de cancelar una accin, y si pulsamos la tecla 'Esc' se ejecutar la accin definida en su evento 'OnClick'. Para ponerlo a prueba, bastar con escribir un poquito de cdigo en los eventos 'OnClick' de cada botn, compilarlo, ejecutarlo y probar a pulsar 'Enter' o 'Esc'. Yo he puesto este fragmento de cdigo:
procedure TForm1.BAceptarClick(Sender: TObject); begin QueBoton.Text:='Aceptar'; end; procedure TForm1.BCancelarClick(Sender: TObject); begin QueBoton.Text:='Cancelar'; end;

'QueBoton' era el campo de edicin, as que cuando pulsemos 'Enter' aparecer el texto 'Aceptar' en el campo de edicin, ya que 'BAceptar' es el botn por defecto, y cuando pulsemos 'Esc' aparecer el texto 'Cancelar' en el campo de edicin, pues 'BCancelar' es el botn de cancelar.

5.5.- Entorno Integrado de Desarrollo


Cuando ejecutamos Delphi, nos encontramos ante un entorno como el que se ve en la imagen, compuesto por varias partes: En la barra de ttulo de la ventana principal (la superior) vemos el nombre del entorno (Delphi) seguido del nombre del proyecto en curso. Bajo la barra de ttulo encontramos el men, con las opciones tpicas de ficheros, herramientas, edicin, etc. La parte inferior izquierda de la ventana principal est ocupada por un conjunto de botones, separados en tres grupos, como vemos en el grfico: Mediante ellos podemos cargar un nuevo proyecto, salvar el actual, etc. Cada uno de estos botones tiene una correspondencia con una opcin del men y algunos de ellos tambin tienen asociada una tecla de acceso rpido. Por ltimo, en la ventana principal de Delphi, encontramos las paletas de componentes Delphi: En principio la paleta activa es la llamada Standard, en la que podemos encontrar los componentes y controles ms habituales en un programa. Las pestaas existentes en la parte superior nos permitirn acceder a la dems paletas de controles. Men de Opciones Este elemento contiene las diferentes opciones del programa agrupadas en varias principales. En Delphi el men de opciones es un apartado con estructura casi fija (es decir, siempre las mismas opciones en el mismo lugar), salvando la posibilidad de aadir opciones mediante la creacin de extensiones al entorno. La Paleta de Botones Otro de los elementos de la ventana principal de Delphi es la Paleta de botones o acciones rpidas. Nos permite ejecutar de forma directa algunas de las opciones del men sin necesidad de buscar por las distintas ventanas. Hay que observar que aquellos que no estn disponibles se muestran en gris. Si dejamos un momento el cursor sobre un botn, aparecer una pequea etiqueta (un hint) que nos indicar de forma breve cul es su funcin. Al igual que otros elementos de Delphi, la paleta de botones tiene asociado un men emergente o contextual, que podemos hacer aparecer pulsando el botn derecho del ratn. Estas opciones nos permiten ocultar la barra de botones, pedir ayuda, decir si queremos que se muestren los hints o no, y personalizarla aadiendo/quitando botones en properties. Si ocultamos la barra de botones, siempre tenemos la opcin de volver a mostrarla en el men View, opcin Speedbar. Paleta de Componentes Aqu podemos seleccionar los elementos que vamos a insertar en un form. Esta tambin puede ser personalizada mediante el men emergente, idntico al de los botones. Igualmente, si ocultamos la paleta de componentes, podemos volver a mostrarla con la opcin Component Palette del men View. Hay que hacer notar lo siguiente: en el panel de la derecha, adems del icono y nombre del componente, tambin aparece el nombre del paquete en que est incluido. En Delphi, todo componente instalado en el entorno debe estar contenido en un paquete, bien de forma aislada o con otros.

El Inspector de Objetos Otro de los elementos que habitualmente est visibles en pantalla es el Inspector de objetos, cuya finalidad es facilitar la edicin de las propiedades correspondientes al componente que se seleccione. En la parte superior aparece el nombre del componente que se est inspeccionando as como su tipo. Es posible seleccionar cualquier componente de la lista desplegable asociada a este campo, o bien marcar el componente en el form. La columna izquierda de la ventana sirve para mostrar los nombres de las propiedades, mientras que en la derecha se muestran los valores que tienen actualmente.

5.6.- Concepto de Proyecto


Adems de forms individuales, Delphi tambin nos permite reutilizar aplicaciones o proyectos completos. De hecho en la pgina Projects del Depsito de objetos existen varios modelos de aplicacin ya "prefabricados". Esta posibilidad est dirigida sobre todo a reducir el tiempo que se emplea en la creacin del esqueleto de una aplicacin, que suele ser siempre igual. Para aadir un proyecto al Depsito de objetos deber abrir el men Project y seleccionar la opcin Add To Repository. Esto mostrar una ventana en donde tendremos que introducir un ttulo, una descripcin e indicar la pgina del Depsito de objetos en la que aparecer. Tambin podemos facilitar el nombre del autor y un icono que le identifique. Dado este paso, siempre que deseemos iniciar un nuevo proyecto podemos elegir la pgina adecuada del Depsito de objetos y hacer un doble clic sobre el icono, ahorrando mucho trabajo. Los proyectos que vayan a aadirse al Depsito de objetos para ser posteriormente utilizados, debern almacenarse en un directorio que tan slo contenga los elementos de ese proyecto. Al crearse una nueva aplicacin tomando esa plantilla como base, Delphi preguntar cul ser el directorio del nuevo proyecto y copiar en l todos esos archivos. Al igual que la mayora de los elementos en Delphi, la ventana del Depsito de objtos cuenta con un men emergente, que podemos hacer aparecer simplemente pulsando el botn derecho del ratn. En este men podemos elegir entre diferentes modos de visualizacin, el orden de los elementos en la ventana y una opcin, llamada Properties, que nos da acceso a la ventana de propiedades del Depsito de objetos, en la que podremos adecuarlo a nuestras preferencias. Tambin podemos acceder a esta ventana mediante la opcin Repository del men Tools. Esta ventana cuenta con dos listas y una serie de botones que ocupan la parte central. La ventana de la izquierda contiene el nombre de cada una de las pginas del Depsito de objetos, as como un elemento, Object Repository, que representa a todos los anteriores juntos. La lista de la derecha muestra los nombres de los elementos existentes en la pgina que hay seleccionada actualmente en la lista de la izquierda, como forms y proyectos. Mediante los botones existentes en la parte central podemos acceder a la mayora de las opciones disponibles.

5.7.- Creacin de la Interfaz Grfica del Proyecto

Cuando queremos hacer una aplicacin para windows en Delphi, lo primero que debemos realizar es la interfaz grafica. La interfaz grafica se realiza con base a la presentacin, estilo y forma que queremos que funcione nuestro programa. A continuacin mostramos un ejemplo de una interfaz grafica. Esta infertaz grafica esta hecha para aceptar pagos de clientes, as tambien como cobranzas y nominas. Cada interfaz puede ser de la manera que al programador mas le convenga.

5.8.- Insercin, Modificacin y Eliminacin de Componentes


Los componentes a insertar en el form, los seleccionamos de la Paleta de componentes, eligiendo primero, si es necesario, la pgina en que se encuentre el componente necesitado. Existen varias formas de insertar un componente en el form, an cuando el resultado final ser el mismo. Si hacemos un doble clic sobre un componente de la Paleta conseguiremos que ste se inserte automticamente en el centro del form, tomando un tamao por defecto. Si lo deseamos, podemos fijar un tamao distinto. En caso de que necesitemos insertar en el form mltiples componentes del mismo tipo, podemos usar un mtodo ms rpido, que consiste en pulsar la tecla de <Mayscula> antes de pulsar el componente de la Paleta. Hecho esto, el componente quedar seleccionado y, simplemente pulsando sobre el form, podremos ir insertando tantas copias del control como sea necesario. Cuando hayamos terminado, tendremos que pulsar sobre el icono que representa al cursor del ratn, que aparece siempre a la izquierda de la Paleta de componentes. Posicin y tamao de los componentes Aunque en el momento en que un control se inserta en el form ste ya toma una posicin y un tamao determinados, estos atributos son modificables siempre y cuando no est activa la opcin Lock Controls, en el men Edit. Para modificar la posicicin en la que se encuentra un componente bastar con <pincharlo>, situando el cursor del ratn sobre l y pulsando el botn izquierdo y <arrastrarlo>, desplazando el cursor del ratn hasta la posicin que deseemos, momento en que liberaremos la pulsacin. Con el fin de alterar el tamao de un componente, primero deberemos seleccionarlo, para lo que bastar con realizar una pulsacin sobre l con el cursor del ratn. Hecho esto, el componente aparecer delimitado por una serie de bloques, que realmente nos indican los puntos por los que podemos redimensionar el control. Aunque todos los componentes tienen una posicin en el form, no todos tienen un tamao definible. Por ejemplo, el componente PrintDialog tiene un tamao fijo, al tratarse de un componente no visual, que en tiempo de ejecucin no aparecer en el form. Cortar, copiar y pegar componentes Los componentes existentes en un form pueden cortarse, copiarse al portapapeles y pegarse desde el portapapeles, de igual forma que podemos hacer con un texto en el editor de cdigo. Al copiar un componente al portapapeles, se conservar informacin acerca de las dimensiones del componente y los valores de sus propiedades, de tal forma que si posteriormente lo pegamos, obtendremos una copia exacta del componente original, a excepcin del nombre.

Los comandos Cut, Copy y Paste pueden ser ejecutados desde el men Edit, pero es mucho ms rpido y cmodo usar las combinaciones de teclas <Control+X>, <Control+C> y <Control+V>. Seleccin de componentes Para seleccionar un componente basta con realizar una pulsacin con el botn izquierdo del ratn, habiendo situado previamente el cursor sobre el componente en cuestin. Otra forma consiste en desplegar la lista existente en la parte superior del Inspector de objetos, eligiendo una de las lneas. Al hacerlo, en el form automticamente se mostrar seleccionado el componente correspondiente a dicha lnea. En ocasiones puede ser interesante seleccionar mltiples componentes en el form, con la finalidad de tratarlos de forma genrica. Para ello podemos usar bsicamente dos mtodos: ir pulsando con el ratn sobre los distintos componentes mientras mantenemos pulsada la tecla de <Mayscula>, o bien trazar en el form, usando el botn izquierdo del ratn, un cuadrado o rectngulo que delimite a todos los componentes que deseamos agrupar. Un grupo de componentes seleccionados puede ser copiado al portapepeles, borrado, desplazado en el form e incluso es posible modificar aquellas propiedades y eventos que son comunes. Alineacin y otras opciones Por defecto, en el interior del form siempre aparece una rejilla de puntos, que slo es visible durante el diseo, desapareciendo en tiempo de ejecucin. La finalidad de esta rejilla es facilitar el correcto posicionamiento de los componentes del form, siendo configurable la distancia entre puntos. Las opciones relacionadas con la rejilla podemos modificarlas en la pgina Preferences de la opcin Environment Options del men Tools.

5.9.- Manejadores de eventos


Un manejador de evento es una seccion de codigo que invoca en su aplicacin en respuesta a un evento. Hay varios eventos posibles:

OnMouseMove. Este evento es recibido por un componente a medida que el cursor del ratn se mueve sobre l. Este evento lleva asociados varios parmetros, como son X e Y, que representan la posicin actual del cursor expresada en puntos, y Shift, un conjunto que puede contener valores dependiendo de qu teclas y botones estn pulsados mientras el ratn se mueve. OnMouseDown. Se genera cuando se pulsa cualquiera de los botones del ratn, recibindolo aquel control que en ese momento se encuentra bajo el cursor. Adems de los parmetros X,Y y Shift, con el mismo significado que en OnMouseMove, el mtodo de respuesta a este evento tambin recibir el parmetro Button, que nos permitir saber qu botn ha sido el que ha producido el evento. Los valores posibles son mbRight, mbLeft y mbMiddle, segn se trate del botn derecho, izquierdo o central. OnMouseUp. Cada vez que se libera un botn del ratn sobre un control, ste recibe el evento OnMouseUp, cuyos parmetros son idnticos a los del evento anterior. OnClick. Aunque este evento tambin puede venir producido por la pulsacin de la barra espaciadora sobre un control o la pulsacin de la tecla <Intro> o <Escape>, en la

mayora de las ocasiones denota una pulsacin en el botn izquierdo del ratn sobre algn control. OnDblClick. Este evento lo recibir un control cuando se realice una doble pulsacin con el botn izquierdo del ratn, teniendo el cursor situado sobre dicho control.

Eventos de teclado Aunque generalmente un form no recibe directamente las pulsaciones de teclado, sino que stas van directamente a alguno de los controles, es posible interceptarlas. Los eventos que nos permitirn hacerlo son:

OnKeyDown. Se produce al pulsarse una tecla, cuyo cdigo es facilitado en el parmetro Key. Al igual que los eventos de ratn, tambin se recibe el parmetro Shift, mediante el cual podremos saber si hay pulsadas otras teclas o botones de ratn. Tengamos en cuenta que el cdigo recibido no es el cdigo ASCII, sino el cdigo virtual de la tecla pulsada. OnKeyUp. Este evento se genera al liberar una tecla. El mtodo de respuesta correspondiente recibir los mismos parmetros descritos en el evento OnKeyDown. OnKeyPress. A diferencia de lo que ocurre con OnKeyDown, que se genera con cualquier tecla alfanumrica, de funcin, control, etc., este evento slo se produce por la pulsacin de las teclas "normales", excluyendo de este conjunto las de funcin, edicin y, en general, todas aquellas que no dispongan de cdigo ASCII. El parmetro Key que se recibe como parmetro corresponde precisamente al cdigo ASCII de la tecla pulsada.

Tanto OnKeyDown como OnKeUp reciben un cdigo de tecla y no un cdigo ASCII del carcter pulsado. Esto les permite detectar la pulsacin de aquellas teclas que no tienen asociado un carcter, como puedan ser las de funcin o las de edicin. Los cdigos de teclas estn representados por una serie de constantes que comienzan con las iniciales VK_.

5.10.- Desarrollo de Proyectos Sencillos


I. Ejemplo con el control Label Este primer ejemplo va a ser muy sencillo: disponemos de una etiqueta a la que cambiaremos su estilo por medio de botones. Crearemos unos cuantos botones que, al pulsarlos, realizarn un cambio u otro sobre la etiqueta. Por ejemplo, al pulsar un botn podemos cambiar el color de la etiqueta, al pulsar otro podemos ponerla en negrita... A la etiqueta la vamos a bautizar con Name=Etiqueta (en el Inspector de Objetos), y con Caption el que querais. No es necesario cambiar el Name de los botones, pero s su Caption. Ahora tenemos que asociar cdigo a los eventos onClick de los botones. Para ello, dado que cada uno de los botones va a efectuar una operacin de cambiar de estilo, primero nos definimos un procedimiento que nos cambien el estilo, y as, cuando llamemos al Click del botn, desde aqu invocaremos al procedimiento de cambio de estilo pasndole como parmetro el estilo a cambiar. Este procedimiento se puede definir, por ejemplo, as:
procedure Tform1.CambiarEstilo(s:TFontStyle); begin With Etiqueta.Font do if s In Style Then Style:=Style-[s] Else

Style:=Style+[s]; end;

No debemos olvidarnos de inclurlo entre los procedimientos que va aadiendo Delphi conforme asociamos cdigo a eventos. En este procedimiento recibimos una variable, s, de tipo TFontStyle, en la que est el estilo a cambiar de la fuente. Para no escribir tanto cdigo, usamos With Etiqueta.Font, pero podramos poner Etiqueta.Font.Style en lugar de Style. Esto lo hacemos para no escribir tantas veces el nombre del objeto. El cdigo es muy sencillo: si el estilo est en el estilo de Etiqueta, se lo quita (Style:=Style-[s];), pero si no lo tiene se lo aade (Style:=Style+[s];). Ahora debemos asociar cdigo a los eventos Click de cada uno de los botones. Esto podemos hacerlo de dos formas, bien pulsando sobre el botn en cuestin, irnos al Inspector de Objetos (con la tecla F11 accedemos a l), pulsar sobre la pestaa Events, escoger OnClick y hacer doble click en la parte de la derecha, o bien pulsamos dos veces sobre el botn en cuestin, y Delphi ya nos crea la cabecera del procedimiento, que tenemos que rellenar apropiadamente. Veamos a continuacin cmo quedara todo el cdigo del ejemplo: unit ejemplolabel; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Etiqueta: TLabel; Boton1: TButton; Boton2: TButton; Boton3: TButton; Boton4: TButton; Boton5: TButton; Boton6: TButton; Boton7: TButton; Boton8: TButton; Boton9: TButton; Boton10: TButton; Boton11: TButton; Boton12: TButton; procedure CambiarEstilo(s:TFontStyle); procedure Boton12Click(Sender: TObject); procedure Boton11Click(Sender: TObject); procedure Boton10Click(Sender: TObject); procedure Boton9Click(Sender: TObject); procedure Boton1Click(Sender: TObject); procedure Boton2Click(Sender: TObject); procedure Boton3Click(Sender: TObject); procedure Boton4Click(Sender: TObject); procedure Boton5Click(Sender: TObject); procedure Boton6Click(Sender: TObject); procedure Boton7Click(Sender: TObject); procedure Boton8Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const MAXTAM : integer=20; MINTAM : integer=10; var Form1: TForm1; implementation {$R *.DFM} procedure Tform1.CambiarEstilo(s:TFontStyle); begin With Etiqueta.Font do if s In Style Then Style:=Style-[s] Else Style:=Style+[s]; end; procedure TForm1.Boton1Click(Sender: TObject); begin Etiqueta.Font.Name:='Arial'; end;

procedure TForm1.Boton2Click(Sender: TObject); begin Etiqueta.Font.Name:='Courier'; end; procedure TForm1.Boton3Click(Sender: TObject); begin Etiqueta.Font.Name:='Roman'; end; procedure TForm1.Boton4Click(Sender: TObject); begin Etiqueta.Font.Name:='Script'; end; procedure TForm1.Boton5Click(Sender: TObject); begin CambiarEstilo(fsBold); end; procedure TForm1.Boton6Click(Sender: TObject); begin CambiarEstilo(fsItalic); end; procedure TForm1.Boton7Click(Sender: TObject); begin CambiarEstilo(fsUnderline); end;

procedure TForm1.Boton8Click(Sender: TObject); begin CambiarEstilo(fsStrikeOut); end; procedure TForm1.Boton9Click(Sender: TObject); begin if(Etiqueta.Font.Size<MAXTAM) then Etiqueta.Font.Size:=Etiqueta.Font.Size+1; end; procedure TForm1.Boton10Click(Sender: TObject); begin if(Etiqueta.Font.Size>MINTAM) then Etiqueta.Font.Size:=Etiqueta.Font.Size-1; end; procedure TForm1.Boton11Click(Sender: TObject); begin Etiqueta.Font.Color:=clBlack; end; procedure TForm1.Boton12Click(Sender: TObject); begin Etiqueta.Font.Color:=clGreen; end; end.

Queda bastante claro cmo invocar al procedimiento que cambia el estilo de la etiqueta mediante los botones. A partir de ahora, cuando ponga el cdigo completo de los ejemplos, no reproducir la parte que hay entre type TForm1=class(TForm) ... end;. Reproducir aquellas constantes y variables que sean importantes (que no sean los controles) y todos los procedimientos, que estn a partir de la palabra implementation. Esto ser as porque conforme vamos aadiendo ms controles y ms eventos, ms largo se hace ese cdigo y no es necesario ponerlo, ya que Delphi lo genera automticamente. Lo que no podemos es olvidarnos de poner las cabeceras de las funciones y/o procedimientos que hagamos nosotros, pues de estas no se encarga Delphi, son responsabilidad nuestra. La finalidad ser esta: cada etiqueta tiene, en el Caption, un &. Por ejemplo, la etiqueta Nombre tiene como Caption &Nombre. As, si pulsamos ALT+N, accederemos a Nombre. Pero esto es slo una etiqueta; estara bien que al pulsar ALT+N se entrara al campo de edicin que tiene al lado, para escribir directamente el nombre. Esto lo conseguimos asociando la etiqueta con el control Edit mediante la propiedad FocusControl de la etiqueta. De la misma manera asociamos el resto de las etiquetas con los campos de edicin que tienen al lado.

Por otro lado, practicaremos cambiando el tamao mximo que pueden admitir los campos de edicin, que podemos cambiar en tiempo de diseo con la propiedad MaxLength. El campo de edicin del nombre y de la direccin deben tener un mximo de 30 caracteres, el del DNI un mximo de 8 y el de la clave un mximo de 10. Adems, el campo de la clave debe mostrar asteriscos en lugar del texto que le entremos. Para ello debemos modificar la propiedad PasswordChar, poniendo un * en lugar de #0. Finalmente, vamos a hacer que lo que escribamos en el campo de edicin del nombre sea el nuevo Caption del form, y que en el DNI slo se introduzcan nmeros. Para ello, tendremos que escribir algo de cdigo en los eventos KeyPress de cada uno de los campos de edicin. El cdigo del programa quedar, pues:
procedure TForm1.EDDNIKeyPress(Sender: TObject; var Key: Char); begin if ( (Key<'0') or (Key>'9') ) and (Key<>#8) then Key:=#0; end; procedure TForm1.EDNombreKeyPress(Sender: TObject; var Key: Char); begin Caption:=EDNombre.Text; end;

Quiz el ms complicado sea el KeyPress del DNI: lo nico que hacemos es que si la tecla no es numrica y no es la de borrar (cuyo cdigo es el 8), entonces la tecla pulsada es 0, es decir, no se muestra la tecla pulsada. Se puede probar un pequeo aadido: que el texto de los campos Nombre y Direccin slo salga en maysculas. Para ello, tendreis que cambiar el valor de la propiedad CharCase por ecUpperCase.

UNIDAD VI
6.1.-Visual C++ como Sistema de Desarrollo
Windows, producto introducido por Microsoft en 1985, es el entorno ms popular de interfaz grfica de usuario (GUI). Para el usuario, Windows es un entorno multitarea basado en ventanas que se corresponden con programas. Esto significa que permite ejecutar concurrentemente programas especialmente escritos para dicho entorno y tambin programas escritos para MSDOS. Para el desarrollo de programas, Windows provee rutinas que permiten utilizar componentes como mens, cuadros de dilogo y barras de desplazamiento entre otros. As mismo, el programador puede manipular el ratn, el teclado, el monitor, la impresora, los puertos de comunicaciones y el reloj del sistema sin tener en cuenta el dispositivo perifrico. Microsoft Visual C++ es un entorno de programacin en el que se combinan la programacin orientada a objetos (C++) y el sistema de desarrollo diseado especialmente para crear aplicaciones grficas para Windows (SDK). Aunque las aplicaciones Windows son sencillas de utilizar, el desarrollo de las mismas no es una tarea fcil. Por ello, para hacer ms asequible esta tarea, Visual C++ incluye, adems de varias herramientas que lo convierten en un generador de programas C++, un conjunto completo de clases (Microsoft Foundation Class, MFC) que permiten crear de una forma intuitiva las aplicaciones para Windows y manejar los componentes de Windows segn su naturaleza de objetos. Esto es, MFC es una biblioteca de clases que encapsula las funciones de la API de Windows, para crear y manipular objetos Windows. Por ejemplo, un objeto Windows "ventana" se construye creando un objeto de la clase CWnd; esta clase proporciona la funcionalidad necesaria para crear, destruir y manipular cualquier caracterstica de esa ventana. Dicha funcionalidad se ha implementado a partir de las funciones de la API de Windows. Como ya se ha dicho, Windows tiene la ventaja de ser fcil para el usuario: el inconveniente de ser difcil para el programador. Segn esto, son requisitos previos, que el lector conozca los conceptos fundamentales para utilizar Windows y que posea conocimientos de programacin con C y de programacin orientada a objetos con C++. Visual C++, cuando se utiliza para desarrollar aplicaciones para Windows, se centra en dos tipos de objetos: ventanas y controles. Utilizando estos objetos podemos disear sin escribir nada de cdigo, una interfaz grfica para una aplicacin. Ahora, para dar funcionalidad a esa interfaz, es necesario aadir el cdigo adecuado. Esto es, para realizar una aplicacin se crean ventanas, a veces llamadas formularios, y sobre ellas se dibujan otros objetos llamados controles y a continuacin se escribe el cdigo fuente relacionado con la funcin que tiene que realizar cada objeto. Quiere esto decir, que cada objeto (ventanas y controles) est ligado a un cdigo que permanece inactivo hasta que se d el suceso (o evento) que lo activa. Por ejemplo, podemos programar un botn (objeto que se puede pulsar) para que responda a un clic del ratn, con una determinada accin. En resumen, Visual C++ es un paquete para desarrollar aplicaciones que incluye, como caractersticas ms sobresalientes:

Una biblioteca de clases, MFC, que da soporte a los objetos Windows tales como ventanas, cajas de dilogo, controles como etiquetas, cajas de texto botones de

pulsacin y objetos GDI (Graphic Device Interface) como lpices (pens), pinceles (brushes), fuentes (fonts) y mapas de bits (bitmaps). Los objetos se comunican entre s mediante mensajes, tambin soportados por las MFC. Nuevas clases para la programacin de hilos (threads). Intercambio de datos con otras aplicaciones (DDE -Dynamic Data Exchange). Creacin y utilizacin de bibliotecas dinmicas (DLL -Dynamic Link Libraries). Galera de objetos incrustados y vinculados (OLE -Object Linking and Embedding). Esto es, software autocontenido en pequeas y potentes unidades componentes software para reutilizar en cualquier aplicacin. Asimismo, Visual C++ proporciona soporte para disear componentes software a medida. Visualizacin y manipulacin de datos de otras aplicaciones Windows utilizando controles OLE. Una interfaz para mltiples documentos que permite crear una aplicacin con una ventana de aplicacin y mltiples ventanas de documento, tal y como, por ejemplo, Microsoft Word (MDI -Multiple Document Interface). Objetos de acceso a datos (DAO) que permiten acceder a bases de datos a travs del motor de Access o de controladores ODBC. Cabeceras precompiladas que reducen el tiempo de compilacin. Un entorno de desarrollo integrado (editor de texto, compilador, depurador, explorador de cdigo fuente, administrador de proyectos, etc.). Asistentes para el desarrollo de aplicaciones como AppWizard, editores de recursos (editor de mens, de dilogos, de tablas de cadenas de caracteres, de tablas de aceleradores y de objetos grficos como mapas de bits o iconos), ClassWizard, ControlWizard, WizardBar y ATL COM Wizard (Activate Template Library Component Object Model Wizard). Personalizacin de AppWizard. A partir de la versin 4.2, Visual C++ integra la biblioteca estndar de C++ e incorpora soporte para la programacin de aplicaciones para internet; forma parte de este soporte la tecnologa de componentes activos (ActiveX). Soporte para el estndar COM (Component Object Model -modelo de objetos componentes; en otras palabras, componentes software) al que pertenecen los componentes activos (ActiveX o formalmente controles OLE). Soporte para aplicaciones que interaccionen con Internet a travs de la API para Internet de Windows (biblioteca WinInet). El nuevo compilador introduce nuevos tipos: el tipo bool y sus constantes asociadas true y false, y el tipo _variant_t (COleVariant). Tambin proporciona informacin de tipos durante la ejecucin (RTTI -Run Time Type Information). Esta caracterstica se habilita por medio de la opcin /GR del compilador e introduce nuevos elementos en el lenguaje. Uno de ellos es el operador typeid que identifica el tipo de un objeto; este operador retorna un objeto de tipo type_info.

Cuando se combinan estas caractersticas, se dispone de un potente sistema de desarrollo que permite disear eficientemente aplicaciones sofisticadas. Anteriormente hemos dicho que con Visual C++ se pueden crear ventanas sin escribir nada de cdigo. Una forma sencilla de crear una ventana es utilizando el editor de dilogos de Visual C++. Otra forma menos sencilla es escribiendo directamente el cdigo que d lugar a la misma. Una ventana sirve de fondo para los controles y para los grficos. Se pueden utilizar tantas ventanas como se necesiten y dependiendo de la utilidad que se las d, stas pueden ser de diferentes tipos; por ejemplo, ventana principal, ventana de dilogo, ventana de presentacin, vista del documento etc.

Los controles son objetos que podemos dibujar sobre la ventana, tales como etiquetas, cajas de texto, casillas de verificacin, botones de opcin, botones de pulsacin, etc., con fines de aceptar o visualizar datos. Para dibujar los controles se utiliza la caja de herramientas del editor de dilogos de Visual C++. Tambin es posible incluir, cualquier imagen existente o diseada a medida con el editor de objetos grficos; por ejemplo, un icono, un mapa de bits o un fichero con formato .wmf, gif o jpeg. Otra forma de dibujar los controles sera escribiendo cdigo para crear cada uno de ellos durante la ejecucin. Una ventana puede tambin incluir mens desplegables y mens desplegables flotantes, para proporcionar al usuario un amplio rango de rdenes seleccionables. A su vez, las rdenes ms utilizadas pueden duplicarse en una barra de herramientas con el fin de proporcionar al usuario un acceso ms cmodo. C++ junto con la biblioteca MFC permite crear aplicaciones de muy diversos tipos. Por ejemplo, bases de datos, control de procesos, representaciones grficas, aplicaciones multimedia, aplicaciones para Internet, etc.

6.2.- Formularios y Componentes


El diseo de un formulario se escribe en el fichero de recursos. Para ayudarnos a realizar este trabajo, utilizamos el editor de dilogos de Visual C++. Empecemos entonces por visualizar el formulario. Dirjase a la ventana Workspace, haga clic en la pestaa ResourceView y haga doble clic en el recurso IDD_MIAPP_FORM. El editor de dilogos le mostrar un formulario vaco como el de la figura siguiente: Para visualizar la ventana de propiedades correspondiente al formulario (Dialog Properties) apunte con el ratn al formulario, pulse el botn derecho y elija la orden Properties del men flotante que se presenta. Una vez visualizada, si no quiere que desaparezca cuando vuelve al formulario despus de establecer una propiedad, pulse el primer botn de su esquina superior izquierda. Las propiedades ID y Caption, especifican el identificador y el ttulo de la ventana, respectivamente. En nuestro ejemplo, como el formulario va a vista de la ventana marco, no necesitamos ttulo. Para visualizar el resto de las propiedades haga clic en la pestaa Styles, More Styles o Extended Styles. Cuando finalice y guarde el diseo, el editor de dilogos almacenar en el fichero de texto miapp.rc las sentencias que hacen referencia a todos los recursos que componen el diseo de la aplicacin. Tambin, guarda en el fichero resource.h los identificadores y los valores enteros asociados de la ventana y de cada uno de los controles. Mover y ajustar el tamao del formulario El formulario es el plano de fondo para los controles. Se puede cambiar el tamao del mismo utilizando el ratn. Para cambiar su tamao, apunte con el ratn a uno de los cuadrados de color de sus lados y cuando el puntero cambie a una flechan doble, con el botn izquierdo del ratn pulsado, arrastre en el sentido adecuado hasta conseguir el tamao deseado. El rea de trabajo puede estar delimitada por unas lneas gua o puede estar llena de puntos regularmente distribuidos. La seccin de una u otra modalidad la puede hacer a travs de la

barra de herramientas Dialog. Para visualizar o no las lneas gua, haga clic en el botn de la derecha de la barra de herramientas Dialog y para visualizar la rejilla, haga clic en el botn anterior. El resto de los botones le permitirn actuar sobre uno o ms controles seleccionados para alinearlos, centrarlos, establecer distancias iguales entre ellos, y establecer la misma anchura, altura o tamao. Las lneas gua delimitan el espacio donde se pueden colocar los controles; y los puntos, forman una rejilla que nos ayudar a alinear los controles que coloquemos dentro de la ventana. Para modificar la rejilla ejecute la orden Grid Settings... del men Layout. Si en un instante determinado quiere ver la funcionalidad del formulario construido, haga clic en el botn de la izquierda de la barra de herramientas Dialog o ejecute la orden Test del men Layout. Para finalizar esta operacin dispone de varias posibilidades: 1. Haga un doble clic en el men de control de la ventana, si lo tiene. 2. Active el men de control de la ventana, si lo tiene, y ejecute la orden Cerrar. 3. Pulse las teclas Alt + F4. 4. Pulse la tecla Esc. Componentes Los componentes software permiten la construccin de aplicaciones utilizando un software autocontenido en pequeas y potentes unidades. Visual C++ soporta a la vez dos tecnologas de componentes software: VBX y OCX. Los componentes VBX son bibliotecas dinmicas de 16 bits y los OCX se presentan en las dos versiones (16 y 32 bits). Los OCX, controles OLE automatizados, representan un estndar en componentes software que ha ido sustituyendo gradualmente a los controles VBX. Esto ha sido as porque un control VBX no poda utilizarse en una aplicacin de 32 bits. La razn es que las bibliotecas dinmicas utilizan la pila del programa que accede a ellas y por lo tanto forman parte del mismo proceso de ejecucin. Esta forma de trabajar hace imposible que una biblioteca dinmica de 16 bits sea cargada por un proceso de 32 bits y viceversa. De los OCX se ha pasado a los ActiveX; controles activos. Los controles activos son controles OCX que representan un nuevo estndar en componentes software porque se trata de controles que adems, pueden ser transferidos a travs de internet. Puesto que un control activo aprovecha la arquitectura OLE, prcticamente cualquier control OCX puede ser transformado en un control activo. Cada control tiene su conjunto particular de propiedades (similares a los datos miembro de las clases) y mtodos (similares a las funciones miembro de las clases) lo que facilita su utilizacin. La incorporacin de estos controles permite mejorar la apariencia visual y la funcionalidad de los programas. Los controles OCX se almacenan normalmente en ficheros con extensin .ocx que se localizan en el directorio...\system. En realidad estos ficheros son bibliotecas dinmicas (DLL) escritas en C. Un control OCX permite una gran interaccin con el usuario, al margen del resto de la aplicacin.

6.3.- Entorno Integrado de Desarrollo


El IDE de Microsoft Visual C++ es un Entorno integrado de desarrollo que permite, de forma sencilla, crear, abrir, visualiza editar, guardar, compilar y depurar todas las aplicaciones C y

C++. Al tratarse de un componente decisivo de Microsoft Development Studio, el entorno de C/C++ opera como una parte ms dentro de la familia completa de lenguajes de Microsoft, incluyendo Visual Basic y Visual J++. La ventaja de esta coleccin de lenguajes de desarrollo radica en la facilidad de aprendizaje y uso que proporciona un conjunto compacto de herramientas y utilidades de desarrollo. Por regla general, excepto para la sintaxis especfica del lenguaje, una vez que se entienden la utilidades de un entorno (por ejemplo, Visual C++), automticamente se tiene conocimiento de cmo utilizar las otras! La integracin del lenguaje de Microsoft Development Studio, permite desarrollar y combinar fcilmente archivos fuentes de mltiples lenguajes en un nico programa. Al igual que todas las componentes del Development Studio, el IDE de Visual C++ contiene opciones para personalizar el entorno de trabajo en funcin de las preferencias personales y ajustarse a los requerimientos hardware especficos para la aplicacin. Inicio del IDE (Entorno integrado de desarrollo) de Visual C++ El inicio del IDE de Visual C++ es sencillo. Si se est utilizando un ratn, se pulsa dos veces sobre el icono de Visual C++, que aparece en el grupo Microsoft Visual C++. La Figura siguiente muestra la pantalla inicial del IDE (Entorno integrado de desarrollo) de Visual C++. Acceso a la ayuda sensible al contexto Se puede acceder fcilmente a la ayuda de cada utilidad del IDE (Entorno integrado de desarrollo) de Visual C++, dado que toda la documentacin del compilador se encuentra en lnea. La utilizacin de este recurso tan valioso es tan sencillo como colocar el cursor sobre la utilidad en cuestin y pulsar la tecla F1. No obstante, la ayuda sensible al contexto no est restringida a las utilidades del IDE de Visual C++. Si se coloca el cursor sobre una construccin del lenguaje C/C++ y se pulsa la tecla F1, automticamente la utilidad de ayuda muestra una descripcin de la sintaxis de la construccin, una explicacin de su uso y, a menudo, un ejemplo ejecutable para clarificarlo. Se pueden utilizar los parmetros por omisin de muchas de las posibilidades del IDE de Visual C++, para hacer ms fcil cl proceso de preparar y ejecutar una aplicacin. Al aumentar la experiencia e incrementar en complejidad los requerimientos de una aplicacin, gradualmente se ganar experiencia en el manejo de las posibilidades ms sofisticadas de este potente entorno. Durante la lectura de este captulo, se puede coger un lpiz y marcar las caractersticas del IDE de Visual C++ que parezcan ms interesantes. (Cuando surja la necesidad de utilizar una de estas utilidades, fcilmente se puede volver a hacer referencia a esta seccin para obtener la explicacin sobre cmo utilizar la correspondiente opcin.

6.4.- Creacin de la Interfase Grfica del Proyecto


En el centro de cada programa de Visual C++ en desarrollo hay un proyecto, que se aloja en un espacio de trabajo. Es posible en Visual C++ alojar mltiples proyectos en un espacio de trabajo. Por ejemplo, est escribiendo una biblioteca de enlace dinmico (DLL), puede tener un espacio de trabajo con un proyecto para la DLL y otro proyecto para el programa pequeo que escribe para probar la DLL.

Proyectos Cuando empieza un programa nuevo, la primera cosa que hace es generar un proyecto para el mismo seleccionando el comando New en el men File. Por ejemplo, un proyecto puede que sea para un programa de juego que est volviendo a escribir, o un programa de utilidad que tiene en mente. El nombre que especifica para su proyecto se utiliza como base para nombrar otros archivos del proyecto, empezando con el archivo de proyecto, nombreproy.dsp. (La extensin .dsp significa proyecto de Developer Studio. Developer Studio es un nombre antiguo para el entorno de desarrollo integrado, o IDE, utilizado por las aplicaciones de Microsoft Visual Studio, incluyendo Visual C++.). El archivo de proyecto mantiene informacin sobre qu archivos de cdigo fuente y archivos de recurso utiliza su programa y sobre cualquier ajuste que haya especificado para controlar cmo Visual C++ construye su programa. El sistema de construccin de Visual C++ utiliza esta informacin cuando compila y enlaza sus archivos para generar un programa ejecutable. Espacios de trabajo Cuando genere un proyecto, tambin generar por defecto un espacio de trabajo.Su archivo de espacio de trabajo, nombreproy.dsw (dsw para el espacio de trabajo Developer Studio), guarda informacin sobre qu ventana de Visual C++ est abierta y dnde se ubican, as como cualquier ajuste que haya especificado para su espacio de trabajo. Cuando genere un proyecto, Visual C++ utiliza ajustes predeterminados para el proyecto y el espacio de trabajo, pero puede alterar stos a medida que trabaja:
o o

Para cambiar los ajustes de construccin para el proyecto, seleccione Settings en el men Project. Para cambiar los ajustes de espacio de trabajo, seleccione Options o Customize en el men Tools.

La pestaa Workspace del cuadro de dilogo Options le permite especificar distintas opciones para sus ventanas, barras de estado y otros componentes del espacio de trabajo. La pestaa Editor del cuadro de dilogo le permite especificar ajustes para el editor de cdigo fuente. El cuadro de dilogo Customize le permite volver a colocar, aadir o borrar botones de la barra de herramientas, comandos de men, atajos de teclado y las herramientas del men de Visual C++ Tools. Trabajar con el proyecto Normalmente trabajar a travs de las siguientes fases para desarrollar sus aplicaciones. Esta seccin describe cada fase paso a paso. Crear un proyecto. Esto crea los archivos iniciales sobre los que se basar su trabajo. Utilizar la ventana Workspace y sus pestaas ClassView, File View y Resource View para trabajar con las clases, archivos y recursos C++ en su proyecto.

Aadir archivos al proyecto o eliminar archivos del proyecto. Editar el cdigo y los recursos fuente en el proyecto. Especificar una configuracin de generacin para el proyecto (versin de depuracin o definitiva). Generar el proyecto (compilar y enlazar el cdigo). Corregir cualquier error de compilacin o vinculacin.

Ejecutar y probar el archivo ejecutable resultante. Depurar el proyecto. Perfilar y optimizar el cdigo (opcional). Creacin de un proyecto

Los proyectos vienen en 16 variedades. Le mostrar cmo crear una Win32 Console Application, el tipo de proyecto ms simple. La secuencia de pasos implicados en la creacin de cada uno de los 16 tipos es normalmente similar, aunque los asistentes utilizados para crear algunos tipos de proyectos se detallan ms que otros. Para algunos tipos de proyectos, Visual C++ crea muchos archivos para ayudarle a iniciarse. Para otros tipo de proyectos, Visual C++ crea archivos que no son de inicio. Una aplicacin de consola utiliza un conjunto de funciones Console API para visualizar su salida en una ventana en modo carcter, como una ventana MS-DOS. Como escribir aplicaciones de consola no requiere ms sobrecarga que escribir una funcin principal, las utilizaremos para probar los programas C++ simples. Para crear un proyecto Win32 Console Application, siga estos pasos, y consulte la siguiente figura segn sea necesario: 1. 2. 3. 4. 5. Haga clic en New en el men File. En el cuadro de dilogo New haga clic en la pestaa Projects. Haga clic en Win32 Console Application. En el cuadro Project name, teclee el nombre de proyecto. Nombraremos.este proyecto First. Utilice el cuadro Location para especificar una ubicacin para los archivos de proyecto. Puede examinar el directorio apropiado haciendo clic en botn Examinar alIado del cuadro Location. Seleccione la opcin Create new workspace. Asegrese de que Win32 est seleccionando en el cuadro Platforms. Haga clic en OK.

6. 7. 8.

A continuacin, siga las instrucciones que aparecen en los cuadros de dilogo que siguen al cuadro de dilogo New. Para una Win32 Console Application slo hay un cuadro semejante: 1. En el cuadro de dilogo Step 1 of 1 (siguiente figura), seleccione una aplicacin <<Hello, World!>>. 2. Haga clic en Finish. 3. En el cuadro de dilogo New Project Information, examine la informacin presentada para asegurarse de que es lo que quera. A continuacin haga clic en OK. Uso de la ventana Workspace Cuando crea un proyecto nuevo, se convierte en el proyecto actual de Visual C++. Ver la ventana Workspace (no titulada) en la parte izquierda de la ventana principal de Visual C++ a no ser que haya cambiado la distribucin de sus ventanas. La Figura siguiente muestra la pestaa ClassView de la ventana Workspace con nuestro proyecto de aplicacin First abierto. La ventana Workspace tiene varias pestaas que apuntan hacia abajo. Para nuestra aplicacin de consola, las pestaas estn etiquetadas como ClassView y FileView. Para una aplicacin que tiene recursos de Windows, hay tambin una pestaa ResourceView.

6.5.- Insercin, Modificacin y Eliminacin


Insercin La siguiente figura muestra la caja de herramientas, que incluye los controles con los que se puede disear la pantalla de la aplicacin. Estos controles son por ejemplo botones, etiquetas, cajas de texto, zonas grficas, etc. Para introducir un control en el formulario simplemente hay que hacer clic en el icono adecuado de la toolbox y colocarlo en el formulario con la posicin y el tamao deseado, arrastrando con el ratn. Con doble clic sobre el icono de un control aparece ste en el centro del formulario y se puede modificar su tamao y/o trasladar con el ratn como se desee. El nmero de controles que pueden aparecer en esta ventana vara con la configuracin del sistema. Para introducir nuevos componentes se utiliza el comando Components en el men Project, Modificacin La ventana de propiedades (PROPERTIES) Todos los objetos Visual Basic 6.0 tienen unas propiedades que los definen: su nombre (Name), su etiqueta o ttulo (Caption), el texto que contiene (Text), su tamao y posicin, su color, si est activo o no (Enabled), etc. La siguiente figura muestra parcialmente las propiedades de un formulario. Todas estas propiedades se almacenan dentro de cada control o formulario en forma de estructura (similar a las del lenguaje C). Por tanto, si por ejemplo en algn momento se quiere modificar el nombre de un botn basta con hacerlo en la ventana de propiedades (al disear el programa) o en el cdigo en Basic (durante la ejecucin), mediante el operador punto (.), en la forma: Boton1.Name = "NuevoNombre" Para realizar una modificacin de las propiedades de un objeto durante el diseo del programa, se activar la ventana de propiedades (con el men, con el botn de la barra de herramientas o pulsando <F4>). Esta ventana tiene dos lengetas, que permiten ordenar las propiedades alfabticamente o por categoras. Utilizando la forma que sea ms cmoda se localizar con ayuda de la barra de desplazamiento la propiedad que se quiera modificar. Al dar clic sobre ella puede activarse un men desplegable con las distintas opciones, o bien puede modificarse directamente el valor de la propiedad. Si esta propiedad tiene slo unos valores fijos (por ejemplo, los colores), puede abrirse un cuadro de dilogo para elegir un color, o el tamao y tipo de letra que se desee si se trata de una propiedad Font. Eliminacin Si desea eliminar varios elementos al mismo tiempo puede seleccionarlos de una vez, Para ello puede seguir dos procedimientos: Si los componentes que desea seleccionar se encuentran directamente en el formulario (es decir, tienen por elemento principal el formulario, por ejemplo, no se encuentran en un panel o en un cuadro de grupo), puede seleccionar dichos elementos trazando un marco a su alrededor, Para ello site el ratn en un espacio libre del formulario, pulse el botn izquierdo del ratn, y arrastre el ratn por encima del formulario con el botn pulsado, Entonces se genera un borde

discontinuo con el cual podr rodear los elementos que se deban seleccionar, Tras soltar el botn del ratn estos se presentarn con los cuadrados de seleccin. Este procedimiento, naturalmente, slo funciona cuando los elementos se pueden incluir en un rectngulo de este tipo, No obstante, de no ser as, tambin puede seleccionar componentes como se describe en el punto siguiente. Es posible seleccionar determinados componentes sueltos, seleccionando primero uno de ellos y luego el resto, manteniendo pulsada la tecla <Mays>, Tambin puede soltar la tecla <Mays> entre cada seleccin, siempre que en la seleccin siguiente vuelva a mantenerla pulsada (si se olvida de pulsar esta tecla se anularn todas las selecciones realizadas hasta el momento y slo se presentar seleccionado el componente que acaba de pulsar). Mediante esta forma de seleccin tambin es posible seleccionar componentes que se en encuentren en paneles.

6.6.- Manejadores de Eventos


Eventos Un evento es una accin reconocida por un objeto (ventana o control). El evento puede ser causado por el usuario (por ejemplo, cuando pulsa una tecla), por el sistema (por ejemplo, transcurri un determinado tiempo), o indirectamente por el cdigo (por ejemplo, cuando el cdigo carga una ventana). En Windows, cada ventana y cada control pueden responder a un conjunto de sucesos o eventos predefinidos. Cuando ocurre uno de estos eventos, Windows enva un mensaje al objeto para identificar y ejecutar la funcin asociada con el objeto para ese evento. Manejo de eventos.- Especifican una arquitectura que define la forma en que actan los componentes entre s. Ejemplo: Eventos del ratn Si analizamos la documentacin de la clase CWnd de la biblioteca MFC, observamos que hay un grupo de funciones que empiezan por On (OnChar, OnKeyDown, OnLButtonDown, etc.). Son funciones miembro llamadas por el esqueleto de la aplicacin para responder a diversos eventos, tales como pulsar una tecla o pulsar el botn izquierdo del ratn. Para saber si hay un ratn presente en el instante de ejecutar una aplicacin, lo nico que tenemos que hacer es invocar a la funcin GetSysternMetrics as: int raton = GetSystemMetrics(SM_MOUSEPRESENT); Si cuando se ejecute la sentencia anterior hay un dispositivo ratn presente, el valor almacenado en la variable ratn ser distinto de cero (true). En este caso, aparecer sobre la interfaz grfica de la aplicacin Windows un mapa de bits denominado cursor o puntero del ratn que podemos desplazar para apuntar a cualquier parte de la pantalla, sin ms que mover el dispositivo ratn. En realidad, slo un pxel de ese mapa de bits es el puntero, del cual conocemos siempre sus coordenadas. Aunque hay varios tipos de cursores predefinidos, tambin podemos disear nuestros propios cursores. Si tambin es preciso conocer cuntos botones tiene el ratn, entonces la sentencia adecuada es: int botones = GetSystemMetrics(SM_CMOUSEBUTTONS); El valor de la variable botones ser cero cuando no haya un ratn presente.

Eventos del Ratn Las ventanas y varios tipos de controles reconocen fundamentalmente tres eventos producidos por el ratn: Clic. Reconocido cuando el usuario pulsa o suelta cualquier botn. Doble clic. Reconocido cuando el usuario pulsa y suelta cualquier botn del ratn dos veces consecutivas de forma rpida. Arrastrar. Reconocido cada vez que el usuario mueve el cursor del ratn a una nueva posicin manteniendo un botn pulsado. Una ventana reconoce un evento del ratn cuando el cursor del ratn est en una zona sobre la ventana en la que no hay ningn control, y un control reconoce un evento del ratn cuando el cursor del ratn est sobre el propio control. Si una aplicacin necesita reconocer un evento del ratn cuando el cursor del mismo est fuera de la ventana, entonces hay que capturar el ratn.

6.7.- Desarrollo de Proyectos Sencillos


Cambiar el ttulo de una ventana. Para cambiar el ttulo de una ventana principal, hay que colocar el cdigo desde alguna clase derivada de CWnd. AfxGetMainWnd()>SetWindowText("Nuevo Ttulo"); SetWindowsText adems trabaja con ventanas hijas MDI. Si ests en una clase CView, se necesita obtener la ventana frame primero. CWnd* pFrame = GetOwner(); pFrame->SetWindowText(szTitle); Crear una aplicacin que permanezca en la barra de tareas. /Este cdigo no utiliza el App Wizard y es posible aplicarlo a cualquier aplicacin #include <afxwin.h> class TaskbarWin : public CFrameWnd { public: afx_msg BOOL OnQueryOpen(void); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(TaskbarApp, CFrameWnd) ON_WM_QUERYOPEN() END_MESSAGE_MAP() class TaskbarApp : public CWinApp { public: BOOL InitInstance(); }; BOOL TaskbarApp::InitInstance() { CFrameWnd* pMain = new TaskbarWin; m_pMainWnd = pMain; m_nCmdShow = SW_SHOWMINNOACTIVE; pMain->Create(NULL, "Barra de Estado"); pMain->ShowWindow(m_nCmdShow); pMain->UpdateWindow(); return TRUE; } BOOL TaskbarWin::OnQueryOpen() {

// Este ejemplo hace sonar beeps cuando la barra de tareas es seleccionada Beep(1000, 200); return FALSE; } TaskbarApp theApp; Ejecutar un archivo .wav 1) Sumar el archivo winmm.lib a la aplicacin 2) Incluir el siguiente header: #include <mmsystem.h>

#define WM_STICKYBUTTONDOWN (WM_USER+1) #define WM_STICKYBUTTONUP (WM_USER+2) /Sumar dos handlers a CStickyButton, uno para BN_CLICKED y otro para WM_KILLFOCUS. Void MyButton::OnClicked() { if (m_bIgnore) { m_bIgnore = FALSE; SetState(TRUE); } else {

3) Ejecutar el wav, llamando al mtodo PlaySound: PlaySound("c:\\windows\\media\office97\\c himes.wav". NULL, SND_FILENAME); Crear un botn multi-estado. Algunas veces es necesario crear un botn que parmanesca abajo cuando es precionado y arriba cuando no se preciona ms. Este efecto es posible realizarlo utilizando algunas clases derivadad de CButton. 1) Crear una aplicacin SDI. 2) Comenzar el Class Wizard y agregar una nueva clase llamada CStickyButton, derivada de CButton. 3) Una vez que el cdigo de CStickyButton fu generado, agregarle 2 variables miembro. BOOL m_bState; BOOL m_bIgnore; / Inicializar las variables en el contructor CStickyButton::CStickyButton() { m_bState = FALSE; m_bIgnore = FALSE; } /CStickyButton necesita notificar al la ventana principal de su estado.

m_bState = !m_bState; SetState(m_bState); ASSERT(GetParent()); GetParent() ->SendMessage(m_bState ? WM_STICKYBUTTONDOWN : WM_STICKYBUTTONUP); } } void MyButton::OnKillFocus(CWnd* pNewWnd) { if (m_bState) { m_bIgnore = TRUE; } CButton::OnKillFocus(pNewWnd); } / La funcin OnClicked reserva el ltimo estado del botn y le indca que permanesca /abajo si es necesario. / Ahora hay que agregar un botn a la clase derivada CView. #include "StickyButton.h" #define IDC_MYBUTTON 105 class CMyView : public CView /Sumar una variable miembro a la clase CView. CStickyButton m_Button;

/Finalmente creamos el boton usando el class wizards para sumar un handler para /WM_CREATE en la clase derivada /CView. int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == 1) return -1; m_Button.Create("Botn multi-estado", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 10, 500, 50), this, IDC_MYBUTTON); rerturn 0; } / Sumar 2 funciones a CView para down y up. void CMyView::OnMyButtonUp (void) { // hacer cuando el botn est up } void CMyView::OnMyButtonDown(void) { // hacer cuando el botn est down } / El ltimo paso es sumar handlers a el message map en la clase derivada CView. BEGIN_MESSAGE_MAP(CStickyView, CView) ON_MESSAGE(WM_STICKYBUTTONDO WN, OnMyButtonDown) ON_MESSAGE(WM_STICKYBUTTONUP, OnMyButtonUp) END_MESSAGE_MAP()

Vous aimerez peut-être aussi