Apunte de la Cátedra UBA Introducción a la Programación Prof. Ferro, Ma. del Pilar Prof. Fernández, Ma. Elisa Algoritmos Para realizar cualquier actividad el hombre necesita desarrollar un método y aplicarlo en sucesivos pasos elementales. Por ejemplo: si deseamos pasar al otro lado de una puerta, comprobaremos primero si está cerrada con llave o no; si no lo está, la abrimos y pasamos al otro lado; si está cerrada, primero debemos buscar la llave, ponerla en la cerradura, hacerla girar para que se abra y, finalmente, pasar al otro lado. Un algoritmo es el conjunto de reglas, secuencias de fórmulas y / o pasos algebraicos y lógicos preestablecidos utilizados para resolver un problema, en un número finito de pasos. Debe tener al menos un resultado. La definición indica que un algoritmo debe tener las siguientes propiedades: Debe obtener al final un resultado. Debe ser aplicable a gran variedad de datos. Debe tener reglas precisas. La definición se completa, en lo que concierne a la informática con las siguientes observaciones: Debe estar constituido por un conjunto finito de instrucciones, terminadas en un tiempo finito. Cada una de sus operaciones es discreta y no continua. Es un procedimiento determinista y no probabilista. Necesita la presencia de un operador (persona o máquina) y de un soporte de memoria (para reglas, datos y resultados parciales). En otra definición, dada por Knuth en "The art of computer programing.", se agrega: Debe ser finito y terminar en número finito de operaciones. Debe ser definido y preciso, es decir, no ser ambiguo. El campo de datos de entradas debe ser preciso. Debe poseer al menos un resultado. Debe ser ejecutable, todas las operaciones deben poder ser efectuadas exactamente y en un tiempo finito. Si se tiene por lo tanto un problema concreto, hará falta formalizar un enunciado algorítmico que en primera instancia es en lenguaje natural, y luego se expresa bajo la forma de un esquema de bloques, o diagrama de flujo, esto es: un gráfico (puede ser a mano alzada) en donde se representan los pasos necesarios a seguir, y el orden en que se deben dar, para resolverlo. De éste se pasará a la escritura del programa, mediante un lenguaje computacional, y a la resolución verdadera y propia del problema. Es decir, un programa es un algoritmo desarrollado para resolver un problema. No existe método para descubrir un algoritmo necesario para la resolución de un problema nunca resuelto. La formulación de un algoritmo nuevo es un acto creativo que depende de la inteligencia, intuición, la lógica y experiencia. Durante la formación de un algoritmo podemos darnos cuenta de que el problema no admite soluciones, no porque no existan, sino porque no se pueden encontrar en forma algorítmica. En caso de que no existan algoritmos para la solución de un problema, es posible que pueda ser dividido en partes algorítmicamente resolubles y en partes que no lo son, y operar después sobre estas últimas con otros métodos de análisis. Básicamente, hacemos en primer lugar un diagnóstico de situación, planteamos hipótesis de resolución (pasos a seguir, lenguaje más adecuado para expresarlo, etc.), valoramos los resultados y hacemos las correcciones necesarias, hasta que su funcionamiento resulte óptimo. En algunos casos la solución de un problema se hace ensamblando algunos algoritmos ya conocidos. Si nos damos cuenta de que un mismo problema admite más de un algoritmo para resolverlo, tendrá preferencia el más económico (en sencillez y velocidad). Cada vez se admite más la idea de que los métodos algorítmicos son propios de cualquier campo de estudio. Se pueden encontrar en los cálculos aritméticos más simples o, incluso, en un análisis gramatical, aún sin que se reconozcan como tales. Si consideramos que un ordenador realizará estrictamente lo que nosotros le hayamos ordenado, y en la misma secuencia en que se lo indiquemos, el algoritmo debe expresar, de forma muy clara, la secuencia de acciones elementales a seguir para la resolución de un problema. Además, si pretendemos que el algoritmo sea independiente de los datos, deberá prever los distintos datos valores que estos puedan tomar y las diferentes alternativas lógicas que se pueden plantear. Expresiones de un algoritmo. Para expresar un algoritmo, podemos utilizar distintos métodos o lenguajes: Lenguaje común: Expresando el algoritmo en un lenguaje que utilizamos normalmente para hablar. Tablas de decisión: Es un método para asociar, en forma de tabla, las condiciones que contempla el algoritmo y las acciones que deben emprender en cada una de ellas. Esquema de bloques o Diagrama de flujo: Organigramas. Es un lenguaje de símbolos gráficos. Pseudocódigos: Utilizado para describir mediante frases en lenguaje común, instrucciones de lenguaje de programación y palabras clave que definen las estructuras básicas. Lenguajes de programación: Expresión de un algoritmo en forma comprensible para el ordenador. Aquí, es de conveniencia dedicar un pequeño apartado acerca de ellos: Los lenguajes de programación. Los lenguajes de programación forman parte de los llamados lenguajes artificiales o pseudo-lenguajes, en contraposición a los lenguajes naturales que en cada lugar habla el hombre. Como todo lenguaje, posee un alfabeto propio, una semántica determinada y reglas sintácticas específicas que posibilitan que cada línea de un programa posea un significado unívoco, preciso, no ambiguo ni vago, para que los datos puedan procesarse en forma confiable y predecible. Existen 3 niveles de lenguaje: Lenguajes de bajo nivel: o Lenguaje binario absoluto ( código maquina) o Lenguaje de assembler o lenguaje simbólico de máquina. Lenguajes de alto nivel. Existen también programas traductores: Compiladores. Intérpretes. Los 2 primeros son particulares de cada máquina, mientras que los lenguajes de alto nivel son independientes de la C.P.U. que los ejecutará. Lenguaje binario absoluto ( código maquina). En el panel frontal de las primeras computadoras, existía un conjunto de llaves “si-no” que permitían formar cada combinación binaria que hacía falta escribir en la Memoria Principal (MP). Así se formaban y escribían en posiciones sucesivas de memoria las combinaciones que constituían el programa a ejecutar y los datos a procesar. Algunos de los inconvenientes de la codificación en absoluto son: dificultad para recordar y manipular los códigos de operación y direcciones como números binarios, la carga de instrucciones y datos en MP, leídos desde un papel, es lenta y propensa a errores de trascripción, es engorroso rastrear errores con las direcciones en binario y ubicados los errores, la corrección puede significar volver a escribir todo el programa nuevamente. Es así, que surge el primer lenguaje simbólico: Lenguaje de assembler o lenguaje simbólico de máquina. Esta forma de programar significó indudablemente un gran adelanto al aliviar al programador de una serie de asignaciones que antes debía establecer y que ahora se encargará de hacerlo el ensamblador. Conviene tener presente que el nombre Assembler tiene 2 acepciones: Una de ellas se refiere al programa traductor “ensamblador” que pasa a lenguaje binario (código de máquina) los programas escritos en lenguaje de bajo o de alto nivel. La otra acepción se refiere a los lenguajes de bajo nivel, simbólicos de máquina, a los que también se los llama “assembler”. Se denomina programa fuente a la forma simbólica inicial, de codificar un algoritmo que ejecutará la computadora, legible para las personas, que al traducirse a lenguaje binario se transforma entonces en programa objeto, de tal forma que un programa objeto es igual al programa fuente traducido a código máquina. Lenguajes de alto nivel Los lenguajes de alto nivel permiten, en gran medida, solucionar las dificultades antes mencionadas, constituyendo un adelanto con respecto a los lenguajes de bajo nivel. También se los denomina “lenguajes orientados al problema”, en el sentido que el programador sólo debe pensar cómo describir su solución, sin tener presente simultáneamente las características del hardware que realizará el proceso de datos. Un lenguaje de alto nivel permite un mayor grado de expresión que uno de assembler y más flexibilidad, dado que cada sentencia permite decir más cosas, por poseer una estructura que obedece a determinado vocabulario, signos de puntuación y gramática, su estructura es relativamente similar al lenguaje natural. Respetando estos elementos, el programador puede construir sentencias que equivalen a muchas instrucciones de máquina. Tengamos en cuenta entonces que reservamos el término instrucción para usarlo en relación con las acciones que se ordenan ya sea en lenguaje simbólico de máquina (assembler) o en código máquina (binario); mientras que la palabra sentencia o línea se empleará para cada uno de los pasos en que se expresa un algoritmo en un lenguaje de alto nivel. Una sentencia o línea también puede denominarse macroinstrucción en el sentido que equivale a una secuencia de instrucciones de máquina. En cambio en assembler cada instrucción es como una palabra aislada, directamente traducible a código binario o de máquina. El uso de lenguajes de alto nivel conlleva algunas ventajas: Mayor capacidad expresiva. Muchos lenguajes de alto nivel, son tan parecidos al lenguaje natural, o tienen herramientas de tipo icónico (gráfico), como los que corren bajo Windows, que permiten una programación fácil, casi intuitiva, accesible aún para quienes no son programadores expertos. Mayor velocidad de programación, ya que requiere un menor número de líneas para escribir un programa. Independencia respecto de la máquina, pues hace abstracción de detalles del hardware. En assembler, los datos del equipo, como procesadores o interfaces que se usen, deben modificarse si se cambia de modelo de computadora. Mayor vida media de los programas. Pero, a pesar de ello no debemos perder de vista que presentan algunas desventajas: La traducción de lenguaje de alto nivel a código de máquina produce programas con más instrucciones que las de programas equivalentes desarrollados por un programador experto en assembler. Mayor tiempo de ejecución del programa. Requiere un mayor gasto de memoria principal. Programas traductores: los compiladores y los interpretes. La existencia de un lenguaje de alto nivel supone, como contrapartida, un programa procesador del mismo capaz de traducir cada sentencia del programa fuente (escrito en el lenguaje de alto nivel) en un conjunto de instrucciones en código binario o de máquina. Un programa compilador va traduciendo cada una de las líneas del programa fuente para producir un módulo o programa objeto, que luego deberá ser montado con otros mediante un editor antes de ejecutarse. El proceso de traducción que realiza un compilador es sumamente complejo dado que debe ser capaz de pasar de palabras en lenguaje natural o expresiones algebraicas que forman una sentencia, a decenas de instrucciones de máquina. Existe otro tipo de programas que efectúan esta misma tarea de traducción de otra forma. Se trata de los interpretes. El intérprete es un programa que toma cada sentencia del programa fuente, la traduce, igual que un compilador, en una secuencia de instrucciones en código de máquina y a continuación permite que se ejecute dicha secuencia. Luego pasa a la siguiente sentencia y así sucesivamente, esto significa que la traducción se lleva a cabo durante el proceso de ejecución del programa. Si una sentencia presenta algún error gramatical no se traduce, e inmediatamente se interrumpe la ejecución del programa en esa acción, indicándose en pantalla el error cometido. Luego de corregirlo, el programador ordena la continuación de la traducción-ejecución de su programa, a partir del número de sentencia corregida, con lo cual el intérprete volverá a procesar en la forma descripta. El programa intérprete, una vez que ejecutó la secuencia de instrucciones correspondiente a la sentencia que tradujo, no la guarda en la MP, sino que ese lugar es ocupado por la secuencia siguiente que va a ser traducida. Esto es, el intérprete no genera módulo objeto, por lo que no necesita editor para el montaje. A diferencia del compilador, que a partir del programa fuente genera otro programa en código objeto. Por lo tanto, cada vez que se quiere ejecutar un programa que usa intérprete, éste debe estar cargado junto con el programa en MP, para traducirlo simultáneamente y permitir la ejecución de cada sentencia traducida. El intérprete sería como esas personas que en una conferencia traducen frase por frase. El traductor debe estar presente durante todo el tiempo. En cambio el compilador sólo está en MP junto con el programa fuente durante el proceso de traducción. Una vez traducido y depurado, el programa objeto se guarda en memoria auxiliar codificado en binario, ocupando menos lugar que el programa fuente correspondiente. Cuando se necesita dicho programa se lo carga en MP y se ordena su ejecución, sin necesidad que esté acompañado por ningún otro. Así el compilador sería como esas personas que traducen libros, una vez que el libro queda enteramente traducido, no se necesita más de su trabajo. De lo expuesto anteriormente podemos deducir que un algoritmo programado en un lenguaje con intérprete proporciona los resultados más lentamente que cuando se programa con un lenguaje con compilador. Esto no se debe a que un lenguaje sea más lento que otro, sino que la interpretación siempre supone un tiempo de traducción que se suma al de ejecución, mientras que un programa compilado ya está traducido antes de ejecutarse. Sin embargo los intérpretes brindan la posibilitar de detectar errores con mayor rapidez y permite que los mismos se corrijan con más facilidad, pues no es necesario esperar a que se traduzca todo el programa fuente para conocer los errores léxicos o sintácticos. PROGRAMACION ESTRUCTURADA De los conceptos expresados hasta el momento podemos decir que un programa es un conjunto de instrucciones ordenadas secuencialmente e interpretables por el ordenador, que le indican el trabajo a realizar para la resolución de un problema. Programar, entonces, es desarrollar un conjunto de instrucciones para formar un programa. Elementos de un programa En un programa podemos identificar cuatro elementos importantes: El objetivo: Es la tarea que se debe realizar cuando se ejecute el programa. El programador: Es el encargado de elaborar el plan o programa. Las instrucciones: Constituyen el núcleo del programa; como dijimos, un programa se compone de una secuencia de frases escritas, instrucciones, según las convenciones de un lenguaje artificial, que pueden ser: Imperativas: ordenan acciones a ejecutar. Declarativas: expresan los elementos que se utilizarán. El ejecutor: Es aquél a quien corresponde el seguimiento de las instrucciones preparadas por el programador. Pasos para armar un programa. Cuando nos proponemos escribir un programa en determinado lenguaje primero debemos hacer el algoritmo que describa cuáles serán los pasos necesarios para resolver el problema. Posteriormente se escribe el programa en el lenguaje elegido y en un tercer momento la computadora ejecutará las instrucciones que componen el programa resolviendo concretamente el problema planteado. En la programación estructurada, los programas son descompuestos en sus partes constituyentes. Las partes más simples son las instrucciones, y normalmente se agrupan en pequeñas organizaciones llamadas estructuras, rutinas o subrutinas. Rutina: parte de un programa, con sentido lógico propio, que se incorpora al programa de la aplicación para ser desarrollado en condiciones especiales (Ver más adelante, los ejemplos de estructuras condicionales en BASIC). Subrutina o subprograma: conjunto de sentencias que se utiliza en varios puntos del programa, o bien que es susceptible de ser insertada en diferentes programas (Ver en la unidad 8, los ejemplos de modularidad en LOGO). Cada lenguaje tiene su tipo de instrucciones o sentencias, así como también su forma de programar. los primeros lenguajes fueron de tipo textual, y secuencial, el programador debía escribir las instrucciones o sentencias secuencialmente, es decir, en el orden en que debían ejecutarse dichas órdenes. Actualmente disponemos de lenguajes más complejos en su construcción pero que hacen más fácil la programación incluso para quienes no son programadores experimentados, ya que es de tipo visual (por lo que su uso resulta más intuitivo), las herramientas se representan con íconos, así que no debemos recordar numerosas y difíciles sentencias; se basan en la programación orientada a objetos, es decir, son modulares, cada objeto del programa se programa independientemente. Para comprender cómo es el proceso de programación daremos algunos ejemplos en lenguaje BASIC y lenguajes visuales. LIST: Nos permite leer el programa y modificarlo. Puede ser reemplazado por F1. SAVE " NOMBRE: Sirve para almacenar el programa en un disquete. Además de la instrucción se debe aclarar cuál es el nombre del programa. LOAD "NOMBRE: Junto con el nombre del programa, sirve para transferir el programa del disquete a la memoria RAM, entonces ya con la instrucción RUN se puede hacer correr. CLS: Limpia la pantalla. LOCATE (y x): Se imparte junto con las coordenadas (y , x) y permite ubicar al cursor en un determinado punto de la pantalla. (Aquí los valores que se asignen a x e y serán los argumentos) PRINT “leyenda: Indica que debe imprimir en pantalla alguna leyenda que debe ir entre comillas. Puede reemplazarse la palabra PRINT por el caracter ?. FOR ... NEXT: Es una estructura que se utiliza cuando es necesario repetir la ejecución de órdenes intermedias que se encuentran entre ellas. Lleva argumento, por ejemplo: Para que en pantalla aparezcan números del 1 al 70, como un listado: Lenguaje BASIC. El lenguaje BASIC es un lenguaje de alto nivel, de tipo imperativo, es decir que está formado por una serie de órdenes o sentencias. Es necesario tener en cuenta dos cosas para expresar en forma correcta el programa: el vocabulario y las reglas que permiten la estructuración correcta, tanto de la instrucción, como del programa (es decir, la sintaxis). El BASIC puede ejecutarse de dos maneras: en forma inmediata o directa y en forma de programa. El empleo directo de sentencias en BASIC permite utilizar la computadora para ejecutar una o varias operaciones aritméticas y ver el resultado en forma inmediata, como con una calculadora. Para ello, escribimos la instrucción y apretando ENTER obtenemos la respuesta. Si escribimos un número de línea, esto significará que la instrucción forma parte de un programa, y dicha instrucción sólo se ejecutará en el orden que le corresponda, cuando se haga correr todo el programa, con la orden RUN. Cuando se trata de un programa, las distintas líneas que lo componen están en forma secuencial, a menos que en alguna línea se encuentre una orden en BASIC que determine lo contrario. Cada línea de un programa recibe el nombre de sentencia, y contiene una o varias instrucciones. Una sentencia se compone de tres elementos: Un número de línea. Una orden en BASIC. Uno o varios argumentos (un valor que complementa a la orden). Para diseñar un programa en BASIC generalmente se hace un planteo algorítmico por medio de un diagrama de flujo y luego es codificado según instrucciones en BASIC. Sentencias más utilizadas en versión GWBASIC: RUN: (Correr) Hace correr el programa, es decir, que funcione. Puede reemplazarse por F2. En BASIC: 120 FOR N= 1 TO 70 130 PRINT N 140 NEXT N Significa: Para un valor entre 1 y 7 Imprime (sale en pantalla) el valor, por ej.: 1 Cuenta el próximo número para imprimir. IF ... THEN ... : Otra estructura, pero de tipo condicional (si… entonces…): Expresa una relación entre cierta condición y una determinada acción IF (condición) THEN (acción); la condición es el argumento que corresponde a la parte IF de la instrucción, en tanto que la acción forma el argumento de la parte THEN (si... entonces...). Por ejemplo: En BASIC: 18 IF A$ = 293589 THEN GOTO 100 19 …(otras sentencias) 20 … 21 … … … 100 PRINT “Acceso denegado.” Significa: En la línea 18 del programa, dice que si el valor ingresado es 293589 (una clave de acceso, por ejemplo, de una tarjeta de crédito, un número de socio de Obra Social, etc. Entonces, vaya a la línea 100. En la línea 100 se ordena imprimir en pantalla la leyenda “Acceso denegado” GOTO: (significa: ir a…)Tiene como argumento un número de línea del programa (en el ejemplo anterior, es 100) y produce la transferencia de ejecución del programa a este número de orden, en el ejemplo, se la línea 18 pasa a la 100, en vez de seguir la secuencia 19, 20, etc. Ejemplo en un programa. Para programar una clave secreta de acceso a algún sitio (nuestra computadora, un documento privado, una cuenta de banco, una cuenta de internet, etc), para que nadie pueda acceder a ese lugar si no tiene la clave: Supongamos que nuestra palabra clave sea PEPE. En BASIC Traducción a lenguaje natural: 1 CLS 10 PRINT: "POR FAVOR INGRESE LA CLAVE" 20 INPUT A$ Borra la pantalla. Aparece en pantalla la leyenda “POR FAVOR INGRESE LA CLAVE”. 30 IF A$ = "PEPE" THEN 100 50 GO TO 1 100 CLS 110 PRINT: "PROCESO FINALIZADO" 200 END Se prepara el cursor para que ingrese la variable (la clave). Si la clave ingresada es PEPE, se va a la línea 100 y continúa ejecutándose hasta el final. Si no es PEPE, sigue leyendo la siguiente línea, la 50. Vuelve a la línea 1 para recomenzar. Se borra la pantalla. Aparece el pantalla la leyenda “PROCESO FINALIZADO”. Cada ícono representa a una aplicación y que se puede “abrir” mediante un doble-clic del mouse. Finaliza el programa. El uso de conocimientos médicos en programas escritos en lenguaje BASIC, puede considerarse como un antecedente que facilita la visión del empleo de la computadora como un valioso auxiliar intelectual, y no sólo como un instrumento de gran capacidad para el manejo de números y datos de tipo administrativo. Programación Visual La revolución causada por las computadoras tomó un nuevo rumbo cuando los diseñadores de sistemas operativos decidieron dar a sus productos una marcada apariencia visual, lo que trajo como resultado que el funcionamiento de las aplicaciones (los programas) se realizara, en la medida de lo posible, con símbolos y componentes gráficos, tal como podemos apreciarlo en Windows, donde las aplicaciones se representan mediante íconos, lo que hace que sea más fácil operarlos, en forma intuitiva. Los lenguajes más difundidos son el VisualBASIC, el ToolBook, el Neobook, y dentro de los lenguajes derivados del LOGO, como veremos en la Unidad VIII, se encuentran el LOGO Gráfico y el Micromundos. El usuario, sin tener que recordar ninguna instrucción, se vale del mouse, haciendo un ligero “doble-clic” sobre el ícono, y la aplicación comienza a ejecutarse. El ejemplo más claro de un programa diseñado bajo esta estructura es el Sistema Operativo Windows, un entorno “amigable” para el usuario: Gráfico: Windows98 (Interfaz Gráfica del Usuario). Una aplicación se define como el conjunto de programas que permite resolver un problema. Se conoce también con el nombre de paquete. Durante la ejecución de un programa, el contenido de la pantalla de la computadora cambia a medida que pasamos de un proceso a otro. Cada cambio trae consigo la posibilidad de introducir datos o recibir información textual o gráfica. Paralelamente al desarrollo de las interfases visuales, los métodos y técnicas utilizados en el diseño y elaboración de programas, se organizaron alrededor de conceptos novedosos. Esto permitió que más personas pudieran participar, no ya como usuarios o clientes de programas estándar, sino como verdaderos creadores de sus propias aplicaciones. Por eso, éstos lenguajes también se llaman “programas de autor”, pues el usuario se convierte en autor de sus programas. El modelo de programación visual hace énfasis en la interfaz gráfica del usuario (GUI Graphical User Interface); para ello, utiliza ventanas como si fueran varias hojas de papel, en donde es fácil desplegar información textual o gráfica. Cada ventana es independiente y agrupa solamente aquellos componentes que sirven para un mismo propósito. Una observación más detenida muestra la capacidad que poseen los sistemas operativos visuales para ejecutar varias aplicaciones simultáneamente, realizar transferencia de datos entre aplicaciones, enlazar con otras computadoras en la red y utilizar periféricos de manera transparente para el usuario (el usuario no debe encargarse de detalles complejos, de ellos se encarga el Sist. Operativo). El ícono “Imprimir” permite, simplemente con un clic, que el documento se imprima, sin tener que especificar qué parte del documento va a imprimirse, en qué impresora, cuántas copias, etc. Anteriormente vimos a la programación estructurada como una metodología que permite acometer cualquier tarea de programación existente. La programación orientada a objetos, más avanzada, no solo contiene a la anterior, sino que introduce las nociones de orden y jerarquía, permitiendo clasificar todos los elementos de un problema en familias que se relacionan, actúan unas sobre otras y forman la base de toda la programación visual. Los objetos son entidades que podemos distinguir; de manera clara y definida; ejemplos de objetos son: una persona, un libro, una computadora o cualquier cosa que podamos percibir con nuestros sentidos. En los programas de los que estamos hablando, los objetos son: Los botones, los sonidos, el fondo de la pantalla, un un color, etc. Los objetos tienen en su naturaleza tres aspectos que debemos considerar: propiedades, métodos y eventos. Una propiedad es una característica observable en un objeto. Las propiedades se reconocen porque describen un aspecto del objeto que podemos medir con una escala establecida previamente (por ejemplo las dimensiones de un dibujo en pixels, si un cuadro de diálogo va a incluir un campo de texto, el color de un botón, etc..). A cada propiedad se le asigna un valor que permite identificar de manera única al objeto. Las propiedades son el primer aspecto que debemos considerar de un objeto, y responden a la pregunta ¿cómo es?. Un método se define como el conjunto de acciones que un objeto debe realizar para conseguir un propósito. Son la parte viva e interesante de un objeto. Los métodos se emplean habitualmente para modificar las propiedades del objeto mismo o de otros objetos. Al modificar una cualquiera de sus propiedades, se altera su apariencia y genera uno o varios cambios que el usuario de la aplicación puede percibir. (Por ejemplo: un cambio de color en el borde de un botón da la apariencia de haber sido presionado), Los métodos son el segundo aspecto que debemos considerar de un objeto, y responden a la pregunta: ¿Qué hacen? Todos los objetos se relacionan con el mundo que los rodea. Esto significa que ningún objeto está aislado, y que recibe siempre el influjo de otros objetos. En el ejemplo, la presión de un botón puede hacer mover otro objeto. Llamamos evento al estímulo que un objeto ejerce sobre otro objeto. Volvemos al ejemplo: el botón tomó el aspecto de presionado, porque había sido presionado con un clic del mouse, lo que produjo también que otro objeto se moviera. Los eventos son el tercer aspecto que debemos considerar de un objeto y responden a la pregunta: ¿ante qué reacciona?. En la programación visual debemos “enseñarle” a un objeto las acciones que debe ejecutar cuando se presente un evento: no hacerlo implica que el objeto no reaccionará cuando el evento ocurra. Se denomina programación de la respuesta ante un evento, al conjunto de acciones (que el programador elige) que un objeto debe realizar ante la aparición de un evento. Otras características de la programación orientada a objetos. Encapsulamiento: Un objeto está separado del medio que lo rodea por algún tipo de envoltura. Esta separación es la que determina la unidad del objeto, lo convierte en algo independiente. La envoltura oculta los detalles relacionados con la “construcción interior del objeto”, lo que implica que algunos métodos y propiedades en un objetos son privados, es decir, útiles únicamente dentro del objeto y desconocidos por quien utiliza el objeto; los restantes son públicos, y los programadores los emplean para cambiar el estado del objeto. Herencia: Un objeto es heredero de otro cuando posee todas sus propiedades, todos sus métodos y reconoce todos sus eventos, y contiene propiedades y eventos adicionales que le son propios. Por ejemplo, si seleccionamos y copiamos un botón que sirve para activar una música mediante un clic, al pegarlo en otra parte, el segundo botón poseerá las mismas propiedades (tamaño, forma, color, etc.) del primero, sus métodos (activar una música), y reaccionará ante los mismos eventos (un clic). El modelo de programación visual permite así organizar las familias de objetos en un orden jerárquico. Se define entonces, la herencia como la característica que tienen los objetos de derivarse unos de otros.