7-10-2013
PORTAFOLIO DE EVIDENCIA.
ALUMNO: AGUSTIN DUARTE PRECIADO PROFESOR: JOSE BENITO FRANCO URREA MATERIA: INTERPRETES HORARIO: 1:00 A 3:00 PLANTEL: CENTRO
INDICE.
Información institucional Introducción Definición de intérprete Estructura de un intérprete Ventajas y desventajas de los interpretes Aplicación de los sistemas basados en intérpretes Tipos de intérpretes Introducción a los análisis sintácticos Tareas 1.- investigación de conceptos. DEPURACIÓN, errores sintácticos, errores semánticos, errores en tiempo de ejecución. 2.- Programación imperativa, funcional, aspecto, arboles sintácticos 3.- Matriz de transición de estado Prácticas de clase Modo consola en python Resolución de ejercicios en SharpDevelop Conclusión. Fin.
INFORMACION INSTITUCIONAL MISION.
La misión de UNIDEP es formar profesionales de éxito que cuenten con actitudes, habilidades y conocimientos que demanda el sector productivo de la región.
VISION.
La Universidad del Desarrollo Profesional es una institución de educación superior de calidad, que ofrece programas presénciales y semipresenciales de bachillerato, profesional asociado, licenciatura, postgrado, diplomados y cursos en México y en el extranjero.
Se distingue por facilitar a sus egresados la incorporación al mercado de trabajo, apoyada en una estrecha vinculación con el sector productivo y en planes de estudios pertinentes y dinámicos.
Es reconocida por su modelo educativo profesionalizarte, por la flexibilidad de su oferta académica impartida en ciclos continuos y por horarios y cuotas accesibles, acordes a la disponibilidad de tiempo y recursos económicos del alumno.
Cuenta con profesores de amplia experiencia profesional y educativa. Sus instalaciones
dentro
de
la
ciudad
permiten
el
fácil
acceso.
Cuenta con un modelo de administración sistematizado, participativo, operado por personal que es recompensado por su desempeño efectivo que le permite maximizar las aportaciones de sus socios y mantener finanzas sanas.
VALORES Y ACTITUDES UNIDEP Lealtad._ Los Integrantes de la comunidad Universitaria consideramos la fidelidad como un valor excelso que enaltecemos en nuestro quehacer diario. Justicia._ Los integrantes de la comunidad Universitaria actuamos con la constante y perpetua voluntad de dar a cada cual lo que le corresponde conforme a sus méritos o actos. Honestidad._ Los integrantes de la comunidad universitaria actuamos con sinceridad y honradez en nuestras tareas y en congruencia entre los pensamientos, palabras y acciones. Responsabilidad._ Los integrantes de la comunidad universitaria llevamos a cabo nuestras actividades con integridad, con sentido del propósito y apegados a los objetivos institucionales. Esfuerzo._ Los integrantes de la comunidad universitaria usamos nuestra máxima energía para cumplir con los objetivos trazados. Creatividad._ Los integrantes de la comunidad universitaria resolvemos los problemas con imaginación, conocimientos y con un espíritu de mejora continua.
INTRODUCCION. En el siguiente trabajo se presentara de forma detallada lo que conformo la materia de intérpretes se presentaran las tareas, trabajos en clase como también proyectos que se realizaron en la materia de intérpretes que conformaran el portafolio de evidencia para a ser más entendible y fácil al ver el contenido.
DEFINICION DE INTÉRPRETES. El funcionamiento de un intérprete se caracteriza por traducir y ejecutar, de una en una, las instrucciones del código fuente de un programa, pero, sin generar como salida código objeto. El proceso que realiza un intérprete es el siguiente: lee la primera instrucción del código fuente, la traduce a código objeto y la ejecuta; a continuación, hace lo mismo con la segunda instrucción; y así sucesivamente, hasta llegar a la última instrucción del programa, siempre y cuando, no se produzca ningún error que detenga el proceso.
ESTRUCTURA DE INTÉRPRETES. En la figura se representa el esquema general de un intérprete puro. Se puede observar que el lenguaje fuente se traduce a una representación interna (texto o binaria) que puede ser almacenada en memoria o en disco. Esta representación interna tiene todas las instrucciones numeradas o colocadas consecutivamente en estructuras de tamaño fijo (por ejemplo un array o posiciones consecutivas de memoria, o un fichero binario de estructuras de tamaño fijo). Mientras se realiza este paso se puede construir la tabla de símbolos o etiquetas, que es una tabla que contiene una estructura donde están todas las etiquetas y su posición en el programa fuente (las etiquetas se utilizan tanto en las instrucciones de salto como en las llamadas a procedimientos y funciones). Una vez que este proceso ha finalizado, comienza la ejecución por la primera instrucción del código, que se envía al evaluador de instrucciones, éste la ejecuta (recibiendo datos si es necesario o enviando un mensaje de error). El evaluador de instrucciones también determina la instrucción siguiente a ejecutar, en algunos casos previa consulta a la tabla de etiquetas. En caso de que no haya saltos (GOTO) se ejecuta la siguiente instrucción a la instrucción en curso.
VENTAJAS Y DESVENTAJAS DE LOS INTÉRPRETES.
Ventajas de un intérprete: Flexibilidad: permite realizar acciones complejas, imposibles o muy difíciles con un compilador, como las siguientes: Ejecución de cadenas de caracteres mediante operadores como "execute", "interprete" o "evalquote". Modificar sobre la marcha el significado de los símbolos e incluso prescindir por completo de las declaraciones. Obtener un ligamiento dinámico completo en los sistemas orientados a objetos. Simplificar la gestión de memoria en los programas fuente. Facilidad de depuración de programas: la interpretación puede interrumpirse en cualquier momento para examinar o modificar los valores de las variables o la situación en la ejecución. La tabla de símbolos está disponible. Se pueden corregir los errores y continuar. Trazas y paradas programadas. Saltos en el programa. Abandonos de subrutinas. Rapidez en el desarrollo. Desventajas de un intérprete: Velocidad: usualmente un orden de magnitud menor que la de un programa compilado. Tamaño del programa objeto, que exige añadir el intérprete al programa propiamente dicho.
APLICACIÓN DE LOS SISTEMAS BASADOS EN INTÉRPRETES. Los sistemas interpretados han tenido una gran importancia desde la aparición de los primeros ordenadores. En la actualidad, la evolución del hardware abre nuevas posibilidades a los sistemas interpretados. La preocupación ya no es tanto la eficiencia como la capacidad de desarrollo rápido de nuevas aplicaciones. Las principales aplicaciones podrían resumirse en: Intérpretes de Comandos: Los sistemas operativos cuentan con intérpretes de comandos como el Korn-Shell, C-Shell, JCL, etc. Estos intérpretes toman un lenguaje fuente que puede incluir sentencias de control (bucles, condiciones, asignaciones, etc.) y ejecutan los diferentes comandos a medida que aparecen en el lenguaje. Lenguajes basados en Escritos (Scripting Languages), diseñados como herramientas que sirvan de enlace entre diferentes sistemas o aplicaciones. Suelen ser interpretados con el fin de admitir una mayor flexibilidad a la hora de afrontar las peculiaridades de cada sistema. Podrían destacarse Perl, Tcl/Tk, JavaScript, WordBasic [Ousterhout 97] Entornos de Programación: Existen ciertos lenguajes que contienen características que impiden su compilación o cuya compilación no es efectiva. Estos lenguajes suelen disponer de un complejo entorno de desarrollo interactivo con facilidades para la depuración de programas. Entre estos sistemas pueden destacarse los entornos de desarrollo para Lisp, Visual Basic, Smalltalk, etc. Lenguajes de Propósito Específico: Ciertos lenguajes incluyen sentencias que realizan tareas complejas en contextos específicos. Existe una gran variedad de aplicaciones en las que se utilizan este tipo de lenguajes como consultas de Bases de Datos, simulación, descripción de hardware, robótica, CAD/CAM, música, etc. sistemas en Tiempo Real: Entornos que permiten modificar el código de una aplicación en tiempo de ejecución de forma interactiva. Intérprete de Código Intermedio: Una tendencia tradicional en el diseño de compiladores es la generación de un código intermedio para una máquina abstracta, por ejemplo, el P-Code de Pascal o los bytecodes de Java. El siguiente paso puede ser: generación del código objeto a partir del código intermedio para una máquina concreta, finalizando el proceso de compilación o interpretar dicho código intermedio en una máquina concreta. La tendencia habitual es definir un lenguaje intermedio independiente de una máquina concreta. Para ello, suele definirse una máquina virtual que contenga las instrucciones definidas por el lenguaje intermedio, permitiendo una mayor portabilidad. Un ejemplo sería la Máquina Virtual de Java, que es simulada en la mayoría de los visualizadores Web.
TIPOS DE INTÉRPRETES. Intérpretes puros Los intérpretes puros son los que analizan y ejecutan sentencia a sentencia todo el programa fuente. Siguen el modelo de interpretación iterativa y, por tanto, se utilizan principalmente para lenguajes sencillos. Los intérpretes puros se han venido utilizando desde la primera generación de ordenadores al permitir la ejecución de largos programas en ordenadores de memoria reducida, ya que sólo debían contener en memoria el intérprete y la sentencia a analizar y ejecutar en cada momento. El principal problema de este tipo de intérpretes es que si a mitad del programa fuente se producen errores, se debe de volver a comenzar el proceso. Intérpretes avanzados Los intérpretes avanzados o normales incorporan un paso previo de análisis de todo el programa fuente. Generando posteriormente un lenguaje intermedio que es ejecutado por ellos mismos. De esta forma en caso de errores sintácticos no pasan de la fase de análisis. Se utilizan para lenguajes más avanzados que los intérpretes puros, ya que permiten realizar un análisis más detallado del programa fuente (comprobación de tipos, optimización de instrucciones, etc.) Intérpretes incrementales Existen ciertos lenguajes que, por sus características, no se pueden compilar directamente. La razón es que pueden manejar objetos o funciones que no son conocidos en tiempo de compilación, ya que se crean dinámicamente en tiempo en ejecución. Entre estos lenguajes, pueden considerarse Smalltalk, Lisp o Prolog. Con el propósito de obtener una mayor eficiencia que en la interpretación simple, se diseñan compiladores incrementales. La idea es compilar aquellas partes estáticas del programa en lenguaje fuente, marcando como dinámicas las que no puedan compilarse. Posteriormente, en tiempo de ejecución, el sistema podrá compilar algunas partes dinámicas o recompilar partes dinámicas que hayan sido modificadas.
Evaluadores Parciales La utilización de evaluadores parciales o especializa dores surge al considerar que muchos programas contienen dos tipos de datos de entrada. Existen una serie de datos de entrada que son diferentes en cada ejecución mientras que otros datos no varían de una ejecución a otra. El primer conjunto, se conoce como datos de entrada dinámicos (se denotará como Din), mientras que el segundo conjunto, serían los datos de entrada estáticos (Est). Dado un programa P, el proceso de evaluación parcial consiste en construir otro programa especializado PEst para los datos estáticos de P.
Compiladores “Just in Time” Con la aparición de Internet surge la necesidad de distribuir programas de una forma independiente de la máquina permitiendo su ejecución en una amplia variedad de plataformas. Los códigos de bytes de la máquina Virtual de Java permiten la ejecución de programas distribuidos, ya que la mayoría de los visualizadores tienen un mecanismo capaz de interpretarlos. La interpretación de códigos de bytes supone una demora en los tiempos de ejecución Compilación Continua La compilación continua surge como un intento de mejorar la compilación “Just in Time”. El sistema mezcla el proceso de compilación a código nativo con el proceso de interpretación. Para conseguirlo, el sistema dispone de dos módulos: un módulo de interpretación de los códigos de bytes y otro módulo de compilación de códigos de bytes a código nativo. La idea consiste en que ambos módulos actúen a la vez (lo ideal sería disponer de dos procesadores), de forma que el sistema no se detenga a compilar un módulo, sino que vaya interpretándolo hasta que el compilador haya generado el código nativo.
INTRODICCION A LOS ANALISIS SINTACTICOS. Sintaxis y Semántica de un Lenguaje de Programación? Sintaxis Como se ve un programa Representación textual o estructura Es posible una definición matemática precisa Semántica Cuál es el significado de un programa Es más difícil dar una definición matemática Por qué hacer análisis sintáctico? Podemos proveer una definición precisa y fácil de entender Una gramática apropiada imparte estructura a un lenguaje de programación Podemos construir automáticamente un pares que determine si el programa es sintácticamente correcto Ayuda en el proceso de traducción Fácil modificar/añadir al lenguaje
TAREAS. Que es un depurador (debugging)? Depuración de programas es el proceso de identificar y corregir errores de programación. En inglés se le conoce como debugging, es que se asemeja a la eliminación de bichos (bugs), manera en que se conoce informalmente a los errores de programación. Se dice que el término bug proviene de la época de los ordenadores de válvula termoiónica, en los cuales los problemas se generaban por los insectos que eran atraídos por las luces y estropeaban el equipo. Si bien existen técnicas para la revisión sistemática del código fuente y se cuenta con medios computacionales para la detección de errores (depuradores) y facilidades integradas en los sistemas lower CASE y en los ambientes de desarrollo integrado, sigue siendo en buena medida una actividad manual, que desafía la paciencia, la imaginación y la intuición del programador. Muchas veces se requiere incluir en el código fuente instrucciones auxiliares que permitan el seguimiento de la ejecución del programa, presentando los valores de variables y direcciones de memoria y ralentizando la salida de datos (modo de depuración). Dentro de un proceso formal de aseguramiento de la calidad puede ser asimilado al concepto de prueba unitaria.
Que son las errores sintácticos? Este tipo de errores siempre son detectados por el COMPILADOR, antes de ejecutar el programa. A los errores tipográficos, como por ejemplo la falta de puntos y comas, nombres de variables incorrectas, falta de paréntesis, palabras claves mal escritas, etc. los llamamos errores SINTACTICOS.
Que son los errores en tiempo de ejecución? Un error en tiempo de ejecución es un problema de hardware o software que impide que un programa funcione correctamente. Los errores en tiempo de ejecución pueden ocasionar la pérdida de información en el archivo en el que esté trabajando, causar errores en el archivo (dañándolo) de forma que no pueda trabajar con él o impedir que use una característica. Al contrario que los errores de detención, los errores en tiempo de ejecución no suelen ser la causa de que Windows o un programa deje de funcionar.
Que son los errores semánticos? El error semántico se da cuando tu programa funciona pero no devuelve el resultado esperado, por ejemplo si tu programa divide 2 número pero el resultado es cualquier otra cosa, sería un error semántico.
Que son los lenguajes formales y leguajes naturales? En matemáticas, lógica, y ciencias de la computación, un lenguaje formal es un lenguaje cuyos símbolos primitivos y reglas para unir esos símbolos están formalmente especificados.1 2 Al conjunto de los símbolos primitivos se le llama el alfabeto (o vocabulario) del lenguaje, y al conjunto de las reglas se lo llama la gramática formal (o sintaxis). A una cadena de símbolos formada de acuerdo a la gramática se la llama una fórmula (o palabra) del lenguaje. Es también llamado lenguaje ordinario, es el que utiliza una comunidad lingüística con el fin primario de la comunicación y se ha construido con reglas y convenciones lingüísticas y sociales durante el período de constitución histórica de esta sociedad. En pocas palabras es el lenguaje que hablamos todos.
Que es clipper? Clipper es un lenguaje de programación procedural e imperativo creado en 1985 por Nantucket Corporation y vendido posteriormente a Computer Associates, la que lo comercializó como CA-Clipper. En un principio Clipper se creó como un compilador para el sistema gestor intérprete de base de datos dBase III (de hecho las versiones estacionales de Nantucket incluían una etiqueta que lo indicaba así), pero con el tiempo el producto evolucionó y maduró, convirtiéndose en un lenguaje compilado más poderoso que el original, no sólo por sus propias implementaciones sino también por las ampliaciones desarrolladas por terceros en C, Ensamblador y Pascal, de los que fue heredando características. Esto lo convirtió en la herramienta líder de desarrollo de aplicaciones de bases de datos relacionales bajo sistema operativo MS-DOS, sobre todo programas de gestión, contabilidad y facturación (SAGE-SP, líder del mercado español, lo usa para ContaPlus y FacturaPlus), agendas comerciales y programas de tarificación (aproximadamente el 80% de las compañías de seguro de España lo utilizaron en los programas de sus agentes).
Las primeras versiones se denominan versiones estacionales por hacer referencia a una estación del año en sus nombres oficiales. Todas ellas se nominaban como compiladores dBase. Estas fueron: Nantucket Clipper Winter'84 - lanzada el 25 de mayo de 1985 Nantucket Clipper Summer'85 - lanzada en 1985 Nantucket Clipper Winter'85 - lanzada el 29 de enero de 1986 Nantucket Clipper Autumn'86 - lanzada el 31 de octubre de 1986 Nantucket Clipper Summer'87 - lanzada el 21 de diciembre de 1987 Gatsoft Clipper Summer'88 - lanzada el 16 de marzo de 1988 Que es foxpro? Visual FoxPro es un lenguaje de programación procedural, orientado a objetos que posee un Sistema Gestor de Base de datos o Database Management System (DBMS) y Sistema administrador de bases de datos relacionales, producido por Microsoft. Visual FoxPro proviene de FoxPro, que a su vez deriva de FoxBASE, creado por Fox Software en 1984; inicialmente un clon de dBase, acabó superándolo y con Clipper, convirtiéndose en una de las estrellas de los lenguajes xBase. Cuando se presentó FoxPro 2.0 se incluyeron varias tecnologías que revolucionaron el mercado de desarrollo de bases de datos las cuales son: La adición de Tecnología Rushmore hizo posible que tablas tuvieran millones de registros sin la necesidad de pasar a tecnologías más caras Las instrucciones SQL que reemplazaban procedimientos completos. SQL fue, y todavía es, el lenguaje de los datos La presentación de medios tipo WYSIWYG (What you see is what you get) que significa: "lo que tu ves es lo que consigues" que abrió el camino a diseñadores de pantallas e informes. Microsoft compró Fox Software en junio de 1992 por 173 millones de dólares. En el momento de la compra el desarrollo de FoxPro 2.5 estaba casi terminado, añadiéndole la capacidad de generar ejecutables para Windows. Las versiones de FoxPro 2.6 para Windows, Mac y Unix se consideran las últimas versiones de FoxPro. Visual FoxPro 3.0 Visual FoxPro 5.0 Visual FoxPro 6.0 Visual FoxPro 7.0 Visual FoxPro 8.0 Visual FoxPro 9.0
Que es dbase? dBASE fue el primer sistema de gestión de base de datos usado ampliamente para microcomputadoras, publicado por Ashton-Tate para CP/M, y más tarde para Apple II, Apple Macintosh,UNIX [1], VMS [2], e IBM PC bajo DOS donde con su legendaria versión III Plus se convirtió en uno de los títulos de software más vendidos durante un buen número de años. dBASE nunca pudo superar exitosamente la transición a Microsoft Windows y terminó siendo desplazado por otros productos como Paradox, Clipper, y FoxPro. Incorporaba un lenguaje propio interpretado y requería un LAN PACK para funcionar sobre red local. En 1988 llegó finalmente la versión IV. dBASE fue vendido a Borland en 1991. Al poco tiempo promovió una casi intrascendente versión 5, de la que llegó a haber versión para Windows. Luego vendió los derechos de la línea de productos en 1999 a dataBased Intelligence, Inc. (dBI) que sigue comercializando nuevas versiones, llamadas dBASE Plus, desde 1999. Durante la primera mitad de los '80s muchas otras compañías produjeron sus propios dialectos o variaciones del producto y lenguaje. Estos incluyeron FoxPro (ahora Visual FoxPro), Quick-Silver, Clipper, Xbase++, FlagShip, y Harbour. Todos ellos son llamados informalmente como xBase o XBase. El formato subyacente de dBASE, el archivo dbf, es ampliamente utilizado en muchas otras aplicaciones que necesitan un formato simple para almacenar datos estructurados. dBASE fue licenciado a los usuarios por un plazo de quince años basado en el inconcebible evento de que un usuario utilizara su copia de dBASE por tan largo período. dBase II dBASE III dBASE IV
Que es informix? Informix es una familia de productos RDBMS de IBM, adquirida en 2001 a una compañía (también llamada Informix o Informix Software) cuyos orígenes se remontan a 1980. El DBMS Informix fue concebido y diseñado por Roger Sippl a finales de los años 1970. La compañía Informix fue fundada en 1980, salió a bolsaen 1986 y durante parte de los años 1990 fue el segundo sistema de base de datos más popular después de Oracle. Sin embargo, su éxito no duró mucho y para el año 2000 una serie de tropiezos en su gestión había debilitado seriamente a la compañía desde el punto de vista financiero. En 2001 IBM, impulsada por una sugerencia de Wal-Mart (el mayor cliente de Informix) compró Informix. IBM tenía planes a largo plazo tanto para Informix como para DB2, compartiendo ambas bases de datos tecnología de la otra. A principios de 2005, IBM lanzó la versión 10 del Informix Dynamic Server (IDS). Antes de su compra, Informix tenía varios productos interesantes que había desarrollado o adquirido. Entre ellos: Informix C-ISAM - la última versión de la base de datos Marathon original. Informix SE - comercializado como sistema de gama baja para ser incrustado en aplicaciones. Informix OnLine - un sistema adecuado para gestionar bases de datos de tamaño medio. Informix Extended Parallel Server (XPS, V8) - una versión de alto rendimiento del código base V7 para ser usado en grandes sistemas distribuidos. Informix Universal Server (V9) - una combinación del motor V7 OnLine con mapeo O-R y soporte DataBlade de Illustra. Informix-4GL - Un lenguaje de cuarta generación para programar aplicaciones. Red Brick Warehouse - Un producto de almacenaje de datos. Cloudscape - un RDBMS completamente escrito en Java que soporta desde dispositivos móviles de gama baja hasta arquitecturas J2EE de altas prestaciones. En 2004 Cloudscape fue liberado por IBM como una base de datos de código abierto para ser gestionado por la Apache Software Foundation bajo el nombre Derby. Suite U2: UniVerse y UniData - bases de datos multidimensionales que soportan redes, jerarquías, matrices y otros tipos de dato difíciles de modelar en SQL.
Programación imperativa. En contraposición a la programación declarativa es un paradigma de programación que describe la programación en términos del estado del programa y sentencias que cambian dicho estado. Los programas imperativos son un conjunto de instrucciones que le indican al computador cómo realizar una tarea. La implementación de hardware de la mayoría de computadores es imperativa; prácticamente todo el hardware de los computadores está diseñado para ejecutar código de máquina, que es nativo al computador, escrito en una forma imperativa. Esto se debe a que el hardware de los computadores implementa el paradigma de las Máquinas de Turing. Desde esta perspectiva de bajo nivel, el estilo del programa está definido por los contenidos de la memoria, y las sentencias son instrucciones en el lenguaje de máquina nativo del computador (por ejemplo el lenguaje ensamblador). Programación funcional. Es un paradigma de programación declarativa basado en la utilización de funciones aritméticas que no maneja datos mutables o de estado. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativa, que enfatiza los cambios de estado. La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en los 1930s para investigar la definición de función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación funcionales pueden ser vistos como elaboraciones del cálculo lambda. En la práctica, la diferencia entre una función matemática y la noción de una "función" utilizada en la programación imperativa es que las funciones imperativas pueden tener efectos secundarios, al cambiar el valor de cálculos realizados previamente. Por esta razón carecen de transparencia referencial, es decir, la misma expresión sintáctica puede resultar en valores diferentes en diferentes momentos dependiendo del estado del programa siendo ejecutado. Con código funcional, en contraste, el valor generado por una función depende exclusivamente de los argumentos alimentados a la función. Al eliminar los efectos secundarios se puede entender y predecir el comportamiento de un programa mucho más fácilmente, y esta es una de las principales motivaciones para utilizar la programación funcional.
Programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa los objetos en sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y enca psulamiento. Su uso se popularizó a principios de la década de los años 1990. En la actualidad, existe una gran variedad de lenguajes de programación que soportan la orientación a objetos. Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard, del Centro de Cómputo Noruego en Oslo. En este centro se trabajaba en simulaciones de naves, que fueron confundidas por la explosión combinatoria de cómo las diversas cualidades de diferentes naves podían afectar unas a las otras. La idea surgió al agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamientos. Fueron refinados más tarde en Smalltalk, desarrollado en Simula en Xerox PARC (cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "sobre la marcha" (en tiempo de ejecución) en lugar de tener un sistema basado en programas estáticos. Los arboles sintácticos. Arboles Sintácticos Jerarquía de Operadores.
UNITARIOS & FUNCIONES (potencia, raíz, seno, coseno, exponencial, logarítmica, etc.) MULTIPLICACIONES & DIVISIONES SUMAS & RESTAS ( ) Alteran la jerarquía
Antes de iniciar a realizar el árbol sintáctico, debemos de enumerar a todos los operadores. Ejemplo: (a +1 b) -3 ( c +2 d )
La suma seria del 1er paréntesis, será la # 1; la suma del 2do paréntesis, será el # 2 y por último la resta será el # 3.
Ya enumerados los operadores, ahora si podemos realizar nuestro árbol sintáctico, y para poder realizar se necesita empezar de atrás para adelante, ósea, del 3 hasta llegar al 1. (a+b) - (c + d) / - \ a+b
c+d
/\
/\
/+\
/+\
a
b
c
d
Si nos tocara hacer el árbol sintáctico de esta expresión: a + b , debemos de ponerla en forma lineal: (a+b) / (c + d). c+d Ahora sí, ya la podemos realizar. (a+b) / (c + d) / / \ a+b
c+d
/\
/\
/+\
/+\
a
b
c
d
Lenguajes interpretativos Algunos lenguajes no pueden compilarse por completo al lenguaje de la máquina por uno de los motivos siguientes: Porque contienen operadores que precisan de la presencia del intérprete, como aquéllos que ejecutan en tiempo de ejecución cadenas de caracteres que representan instrucciones del lenguaje fuente (APL, LISP, Prolog, Smalltalk). Porque han eliminado totalmente la declaración de las variables, de tal modo que una variable tiene siempre el tipo del último valor que se le asignó (APL, LISP, Smalltalk). Porque se ha eliminado la gestión dinámica de la memoria, confiándole al intérprete la eliminación automática de la memoria no utilizada (APL, JAVA, LISP, Smalltalk). Porque la presencia del intérprete durante la ejecución es necesaria por razones de seguridad o de independencia de la máquina (JAVA). Entre los lenguajes interpretativos destacan APL, JAVA, LISP, Prolog, Rexx, Smalltalk y SNOBOL. Ventajas de un intérprete Flexibilidad: permite realizar acciones complejas, imposibles o muy difíciles con un compilador, como las siguientes: o Ejecución de cadenas de caracteres mediante operadores como "execute", "interprete" o "evalquote". o
Modificar sobre la marcha el significado de los símbolos e incluso prescindir por completo de las declaraciones.
o
Obtener un ligamiento dinámico completo en los sistemas orientados a objetos.
o
Simplificar la gestión de memoria en los programas fuente.
Facilidad de depuración de programas: la interpretación puede interrumpirse en cualquier momento para examinar o modificar los valores de las variables o la situación en la ejecución. La tabla de símbolos está disponible. Se pueden corregir los errores y continuar. Trazas y paradas programadas. Saltos en el programa. Abandonos de subrutinas. Rapidez en el desarrollo. Desventajas de un intérprete Velocidad: usualmente un orden de magnitud menor que la de un programa compilado. Tamaño del programa objeto, que exige añadir el intérprete al programa propiamente dicho.
Comandos del Shell. ls Lista el contenido de un directorio. Si lo usamos sin argumentos, lista el contenido del directorio actual o corriente. Por más información: man ls
grep: Este comando permite buscar en líneas conjuntos de datos de texto sin formato que se correspondan con una expresión regular. Por tanto, constituye una herramienta fundamental para cualquier usuario de secuencias de comandos o shell de Linux. Por ejemplo: grep foo /etc/passwd devuelve cualquier línea del archivo de contraseña que contenga la cadena “foo”, mientras que grep -i "foo" /etc/passwd Busca cualquier línea del archivo de contraseña que tenga alguna variación de “foo”, como “FOO” o “fOo”. El comando grep también puede usarse para buscar de forma recurrente, es decir, para leer todos los archivos de cada directorio en busca de la cadena “foo”: grep -r "foo" /home/sjvn Asimismo, se utiliza también a menudo con el comando de tubería para buscar cadenas específicas de la salida de otro comando. De este modo: ls -la | grep foo*
clear: ¿Tienes demasiadas cosas en la pantalla de tu terminal? Solo tienes que ejecutar clear y desaparecerá todo. Y si luego necesitas buscar la información que has borrado de la pantalla, utiliza las teclas de flecha arriba y abajo para recuperar del historial los comandos recientemente emitidos y volver a ejecutarlos según sea necesario. Comandos de directorios cp: Significa “copiar” y hace exactamente lo que uno se imagina: copia uno o más archivos con un nombre diferente o en un directorio distinto. He aquí algunos de los usos más habituales: cp fred.txt ethel.txt Copia el archivo fred.txt en el mismo directorio actual, asignándole el nuevo nombreethel.txt.
cp fred.txt /home/sjvn/docs/fred.txt Copia fred.txt en el directorio /home/sjvn/docs. cp *.txt /home/sjvn/docs/ Copia todos los archivos que terminan en .txt en el directorio /home/sjvn/docs/. cp -r /home/sjvn/docs/* /home/sjvn/backup Copia todos los archivos, directorios y subdirectorios del directorio /home/sjvn/docs en el directorio /home/sjvn/backup. Awk busca ciertos patrones en la entrada, y la procesa de la manera especificada. Awk tiene una gran funcionalidad, pero esta mayor funcionalidad tiene su coste reflejado en una mayor complejidad del lenguaje. Una
posible
sintaxis
de
awk
sería:
awk [fichero_entrada] La estructura básica del comando chmod es: chmod <permisos> <fichero> Ejemplo: chmod 777 fichero.txt El primer dígito se refiere al permiso del propietario, el segundo dígito al grupo y el tercero a los demás usuarios. Telnet es una manera facil de acceder a la Linea de Comandos (Shell) de tu WRT54G y acceder a configuración no disponible via la interfaz web. Ya que las contraseñas de Telnet no estan encriptadas, es vulnerable a ataques de sniffing. Secure Shell es un reemplazo para Telnet que usa encripción dura, y es recomendado su uso sobre Telnet en cualquier red pública. (Ver Sección SSH abajo.) Telnet opera en el puerto 23 y usa un protocolo ASCII. Para acceder a nuestro espacio FTP desde la consola Linux debemos conectar con nuestro servidor a través del comando "ftp". Vamos a tomar como ejemplo, que nuestro servidor sea "ficus" (en caso de que nuestro servidor fuera otro, únicamente habría que cambiar ficus por el nombre de nuestro servidor).
#
su
#~>
de
SuperUsuario
Bien ahora tendrías que introducir el Password: , que en ningún momento va a estar a la vista lo que escribes, y una vez logeados como root en la shell se distinguiria por el nombre. [root@pepito Escritorio]# ~> Notece que al logear como root sale [Pepito@local Escritorio]$ ~> Mientras que como usuario "comun" tendriamos un $.
el
#.
Para...
un....
Uso el comando...
Borrar
archivo
rm
Borrar
directorio
rmdir
Crear
archivo (vacio)
touch
Crear
directorio
mkdir
Cambiar
directorio
cd
Cambiar
archivo
sed
Copiar
archivo
cp
Editar
archivo
sed
Encontrar
archivos
find
Encontrar
patron en archivo
grep
Encadenar
archivos
cat
Mover
archivos
mv
Ir a
directorio
cd
Listar
directorio
ls
Listar
procesos
ps
Ordenar
lineas de archivo
sort
Partir lineas
de archivo
cut
Pegar
archivos
cat
Pegar
columnas de archivos
paste
Procesar
archivos
awk
Renombrar
archivo
mv
Reformatear
archivo
awk
Ver
sistema de arch.
df
Ver
un archivo
more
Ver
directorio
ls
Ver
cabeza de archivo
head
Ver
Cola de archivo
tail
Desde el punto de vista del modelo de estado, una vez que se ha obtenido éste interesa conocer la información que proporciona, esto es, la posibilidad de analizar el comportamiento dinámico del sistema a lo largo del tiempo. Para ello se debe tener una expresión explícita de la solución o trayectoria del sistema en su espacio de estado, esto es, del vector de estado. Esta solución exige el cálculo de la ecuación de estado. Cuando ésta es no lineal, su solución puede ser muy compleja, de modo que la mayoría de las veces habrá que descartar la obtención de una expresión analítica, quedando pues la solución en el ámbito del análisis numérico realizado mediante computador. Sin embargo, cuando la ecuación de estado es lineal, bien porque el sistema lo es, o bien porque es el resultado de la linealización de un sistema no lineal, la ecuación de estado admite una solución analítica que es fácil de obtener y proporciona una información muy rica de la evolución temporal de las trayectorias (coordenadas del vector de estado) del sistema. Sea pues la ecuación de estado en su forma lineal siguiente:
Aplicando la transformada de Laplace con la condición inicial
O también
Esto es,
Como se sabe,
por tanto,
se tiene que
Aplicando la transformada inversa de Laplace para obtener la soluci贸n temporal se tiene que
La matriz
.
PREACTICOS DE CLASE MODO CONSOLA EN PYTHON. Prácticas de clase Modo consola en Python. Variables, expresiones y sentencias Valores y tipos Los valores pertenecen a diferentes tipos: 2 es un entero, y "Hola, Mundo!" es una cadena, llamada así porque contiene una “cadena” de letras. Usted (y el intérprete) pueden identificar cadenas porque están encerradas entre comillas. La sentencia de impresión también trabaja con enteros. >>> print 4 4 Si no está seguro del tipo que un valor tiene, el intérprete le puede decir. >>> type("Hola, Mundo!") <type ’string’> >>> type(17) <type ’int’> >>> type(3.2) <type ’float’> ¿Qué ocurre con valores como "17" y "3.2"? Parecen números, pero están encerrados entre comillas como las cadenas. >>> type("17") <type ’string’> Ellos son cadenas. >>> type("3.2") <type ’string’> Variables Una de las características más poderosas en un lenguaje de programación es la capacidad de manipular variables. Una variable es un nombre que se refiere a un valor. La sentencia de asignación crea nuevas variables y les da valores: >>> mensaje = "¿Qué Onda?" >>> n = 17 >>> pi = 3.14159 La sentencia print también funciona con variables. >>> print mensaje Qué Onda? >>> print n
17 >>> print pi 3.14159 En cada caso el resultado es el valor de la variable. Las variables también tienen tipos; nuevamente, le podemos preguntar al intérprete cuales son. >>> type(mensaje) <type ’string’> >>> type(n) <type ’int’> >>> type(pi) <type ’float’> El tipo de una variable es el mismo del valor al que se refiere.
Nombres de variables y palabras reservadas Los programadores, generalmente, escogen nombres significativos para sus variables —que especifiquen para qué se usa la variable. Estos nombres pueden ser arbitrariamente largos. Pueden contener letras y números, pero tienen que empezar con una letra. Aunque es legal usar letras mayúsculas, por convención no lo hacemos. Si usted lo hace, recuerde que la capitalización importa, Pedro y pedro son variables diferentes. El carácter subrayado ( _) puede aparecer en un nombre. A menudo se usa en nombres con múltiples palabras, tales como mi_nombre o precio_del_café_en_china. Si usted le da un nombre ilegal a una variable obtendrá un error sintáctico: >>> 76trombones = "gran desfile" SyntaxError: invalid syntax 76trombones es ilegal porque no empieza con una letra. >>> mas$ = 1000000 SyntaxError: invalid syntax mas$ es ilegal porque contiene un carácter ilegal, el símbolo $. >>> class = "introducción a la programación" SyntaxError: invalid syntax ¿Qué sucede con class? Resulta que class es una de las palabras reservadas (keywords) de Python. Las palabras reservadas definen las reglas del lenguaje y su estructura, y no pueden ser usadas como nombres de variables. Python tiene veintiocho palabras reservadas: and continue else for import not assert def except from in or break del exec global is pass
class elif finally if lambda print raise return try while
Evaluando expresiones Una expresión es una combinación de valores, variables y operadores. Si usted digita una expresión en la línea de comandos, el intérprete la avalúa y despliega su resultado: >>> 1 + 1 2 Un valor, por sí mismo, se considera como una expresión, lo mismo ocurre para las variables. >>> 17 17 Aunque es un poco confuso, evaluar una expresión no es lo mismo que imprimir o desplegar un valor. >>> mensaje = "Como le va, Doc?" >>> mensaje "Como le va, Doc?" >>> print mensaje Como le va, Doc? Cuando Python muestra el valor de una expresión que ha evaluado, utiliza el mismo formato que se usaría para entrar un valor. En el caso de las cadenas, esto Implica que se incluyen las comillas. Cuando se usa la sentencia print, el efecto es distinto como usted ya lo ha evidenciado. Operadores y operandos Los operadores son símbolos especiales que representan cómputos, como la suma y la multiplicación. Los valores que el operador usa se denominan operandos. Los siguientes son expresiones validas en Python, cuyo significado es más o menos claro: 20+32 hora-1 hora*60+minuto minuto/60 5**2 (5+9)*(15-7) Los símbolos +, -, y /, y los paréntesis para agrupar, significan en Python lo mismo que en la matemática. El asterisco (*) es el símbolo para la multiplicación, y ** es el símbolo para la exponenciación.
Cuando el nombre de una variable aparece en lugar de un operando, se reemplaza por su valor antes de calcular la operación La suma, resta, multiplicación y exponenciación realizan lo que usted esperaría, pero la división podría sorprenderlo. La siguiente operación tiene un resultado inesperado: >>> minuto = 59 >>> minuto/60 0 El valor de minuto es 59, y 59 dividido por 60 es 0.98333, no 0. La razón para esta discrepancia radica en que Python est{a realizando división entera. Cuando los dos operandos son enteros el resultado también debe ser un entero; y, por convención, la división entera siempre redondea hacia abajo, incluso en casos donde el siguiente entero está muy cerca. Orden de las operaciones Cuando hay más de un operador en una expresión, el orden de evaluación depende de las reglas de precedencia. Python sigue las mismas reglas de precedencia a las que estamos acostumbrados para sus operadores matemáticos. El acrónimo PEMDAS es útil para recordar el orden de las operaciones: Los Paréntesis tienen la precedencia más alta y pueden usarse para forzar la evaluación de una expresión de la manera que usted desee. Ya que las expresiones en paréntesis se evalúan primero: 2 * (3-1) es 4, y (1+1)**(5-2) es 8. Usted también puede usar paréntesis para que una expresión quede más legible, como en (minuto * 100) / 60, aunque esto no cambie el resultado. La Exponenciación tiene la siguiente precedencia más alta, así que 2**1+1 es 3 y no 4, y 3*1**3 es 3 y no 27. La Multiplicación y la División tienen la misma precedencia, aunque es más alta que la de la Adición y la Sustracción, que también tienen la misma precedencia. Así que 2*3-1 es 5 en lugar de 4, y 2/3-1 es -1, no 1 (recuerde que en división entera, 2/3=0). Los operadores con la misma precedencia se evalúan de izquierda a derecha. minuto=59, en la expresión minuto*100/60; la multiplicación se hace primero, resultando 5900/60, lo que a su vez da 98. Si las operaciones se hubieran evaluado de derecha a izquierda, el resultado sería 59/1, que es 59, y no es lo correcto. Operaciones sobre cadenas En general, usted no puede calcular operaciones matemáticas sobre cadenas, incluso si las cadenas lucen como números. Las siguientes operaciones son ilegales (asumiendo que mensaje tiene el tipo cadena):
mensaje-1 "Hola"/123 mensaje*"Hola" "15"+2 Sin embargo, el operador + funciona con cadenas, aunque no calcula lo que usted esperaría. Para las cadenas, el operador + representa la concatenación, que significa unir los dos operandos enlazándolos en el orden en que aparecen. Por ejemplo: fruta = "banano" bienCocinada = " pan con nueces" >>>print fruta + bienCocinada La salida de este programa es: Banano pan con nueces. El espacio antes de la palabra pan es parte de la cadena y sirve para producir el espacio entre las cadenas concatenadas. El operador * también funciona con las cadenas; hace una repetición. Por ejemplo, ’Fun’*3 es ’FunFunFun’. Uno de los operados tiene que ser una cadena, el otro tiene que ser un entero.
Estas interpretaciones de + y * tienen sentido por la analogía con la suma y la multiplicación. Así como 4*3 es equivalente a 4+4+4, esperamos que "Fun"*3 sea lo mismo que "Fun"+"Fun"+"Fun", y lo es.
Practica 2
Composición Hasta aquí hemos considerado a los elementos de un programa—variables, expresiones y sentencias—aisladamente, sin especificar como combinarlos. Una de las características más útiles de los lenguajes de programación es su capacidad de tomar pequeños bloques para componer con ellos. Por ejemplo, ya que sabemos cómo sumar números y cómo imprimirlos; podemos hacer las dos cosas al mismo tiempo: >>> print 17 + 3 20 De hecho, la suma tiene que calcularse antes que la impresión, así que las acciones no están ocurriendo realmente al mismo tiempo. El punto es que cualquier expresión que tenga números, cadenas y variables puede ser usada en una sentencia de impresión (print). Usted ha visto un ejemplo de esto: >>>minuto=60 >>>hora=60 >>>print "Número de minutos desde media noche: ", hora*60+minuto Comentarios A medida que los programas se hacen más grandes y complejos, se vuelven más difíciles de leer. Los lenguajes formales son densos; y, a menudo, es difícil mirar una sección de código y saber qué hace, o por qué lo hace. Por esta razón, es una muy buena idea a ˜nadir notas a sus programas para explicar, en lenguaje natural, lo que hacen. Estas notas se denominan comentarios y se marcan con el símbolo #: >>># calcula el porcentaje de la hora que ha pasado >>>porcentaje = (minuto * 100) / 60 En este caso, el comentario aparece en una línea completa. También pueden ir comentarios al final de una línea: >>># precaución: división entera porcentaje = (minute * 100) / 60 Glosario Valor: un número o una cadena (u otra cosa que se introduzca más adelante) que puede ser almacenado en una variable o calculado en una expresión.
Tipo: conjunto de valores. El tipo del valor determina como se puede usar en expresiones. Hasta aquí, los tipos que usted ha visto son enteros (tipo int), números de punto flotante (tipo float) y cadenas (tipo string). Punto flotante: formato para representar números con parte decimal. Variable: nombre que se refiere a un valor. Sentencia: sección de código que representa un comando o acción. Hasta aquí las sentencias que usted ha visto son la de asignación y la de impresión. Asignación: corresponde a la sentencia que pone un valor en una variable. Palabra reservada: es una palabra usada por el compilador para analizar sintácticamente un programa; usted no puede usar palabras reservadas como if, def, y while como nombres de variables. Operador: símbolo especial que representa un simple cálculo como una suma, multiplicación o concatenación de cadenas. Operando: uno de los valores sobre el cual actúa un operador. Expresión: combinación de variables, operadores y valores que representa un único valor de resultado. Evaluar: simplificar una expresión ejecutando varias operaciones a fin de retornar un valor único. División entera: operación que divide un entero por otro y retorna un entero. La división entera retorna el número de veces que el denominador cabe en el numerador y descarta el residuo. Reglas de precedencia: reglas que gobiernan el orden en que las expresiones que tienen múltiples operadores y operandos se evalúan. Concatenar: unir dos operandos en el orden en que aparecen. Composición: es la capacidad de combinar simples expresiones y sentencias dentro de sentencias y expresiones compuestas para representar cálculos complejos concisamente. Comentario: información que se incluye en un programa para otro programador (o lector del código fuente) que no tiene efecto en la ejecución. Conversión de tipos Python proporciona una colección de funciones que convierten valores de un tipo a otro. La función int toma cualquier valor y lo convierte a un entero, si es posible, de lo contrario se queja: >>> int("32") 32 >>> int("Hola") ValueError: invalid literal for int(): Hola int también puede convertir valores de punto flotante a enteros, pero hay que tener en cuenta que va a eliminar la parte decimal: >>> int(3.99999) 3 >>> int(-2.3) -2
La función float convierte enteros y cadenas a número de punto flotante: >>> float(32) 32.0 >>> float("3.14159") 3.14159 Finalmente, la función str convierte al tipo cadena (string): >>> str(32) ’32’ >>> str(3.14149) ’3.14149’ Coerción de tipos Ahora que podemos convertir entre tipos, tenemos otra forma de esquivar a la división entera. Retomando el ejemplo del capítulo anterior, suponga que deseamos calcular la fracción de una hora que ha transcurrido. La expresión más obvia minuto/60, hace división entera, así que el resultado siempre es 0, incluso cuando han transcurrido 59 minutos. Una solución es convertir minuto a punto flotante para realizar la división en punto flotante: >>> minuto = 59 >>> float(minute)/60.0 0.983333333333 Otra alternativa es sacar provecho de las reglas de conversión automática de tipos, que se denominan coerción de tipos. Para los operadores matemáticos, si algún operando es un número flotante, el otro se convierte automáticamente a flotante: >>> minuto = 59 >>> minuto / 60.0 0.983333333333 Así que haciendo el denominador flotante, forzamos a Python a realizar división en punto flotante.
Practica 3 Operadores aritméticos
Operador Descripción Ejemplo +
Suma
r = 3 + 2 # r es 5
-
Resta
r = 4 - 7 # r es -3
Operador Descripción
Ejemplo
-
Negación
r = -7 # r es -7
*
Multiplicación
r = 2 * 6 # r es 12
**
Exponente
r = 2 ** 6 # r es 64
/
División
r = 3.5 / 2 # r es 1.75
//
División entera r = 3.5 // 2 # r es 1.0
%
Módulo
r = 7 % 2 # r es 1
Booleanos Una variable de tipo booleano sólo puede tener dos valores: True (cierto) y False (falso).
Estos son los distintos tipos de operadores con los que podemos trabajar con valores booleanos, los llamados operadores lógicos o condicionales:
Operador Descripción
Ejemplo
and
¿Se cumple a y b? r = True and False # r es False
or
¿Se cumple a o b? r = True or False # r es True
not
No a
r = not True # r es False
Los valores booleanos son además el resultado de expresiones que utilizan operadores relacionales (comparaciones entre valores):
Operador Descripción
Ejemplo
==
¿son iguales a y b?
r = 5 == 3 # r es False
!=
¿son distintos a y b? r = 5 != 3 # r es True
<
¿es a menor que b?
r = 5 < 3 # r es False
>
¿es a mayor que b?
r = 5 > 3 # r es True
<= ¿es a menor o igual que b? r = 5 <= 5 # r es True >= ¿es a mayor o igual que b? r = 5 >= 3 # r es True
Listas La lista es un tipo de colección ordenada. Sería equivalente a lo que en otros lenguajes se conoce por arrays, o vectores. Las listas pueden contener cualquier tipo de dato: números, cadenas, booleanos, … y también listas. Crear una lista es tan sencillo como indicar entre corchetes, y separados por comas, los valores que queremos incluir en la lista:
>>>a = [22, True, “una lista”, [1, 2]]
Podemos acceder a cada uno de los elementos de la lista escribiendo el nombre de la lista e indicando el índice del elemento entre corchetes.
NOTA: Ten en cuenta que el índice del primer elemento de la lista es 0, y no 1:
>>>a[2] ‘una lista’ >>>a[0] 22 Si queremos acceder a un elemento de una lista incluida dentro de otra lista. >>> a = [22, True, “una lista”, [1, 2]]
Tendremos que utilizar dos veces este operador, primero para indicar a qué posición de la lista exterior queremos acceder, y el segundo para seleccionar el elemento de la lista interior: si queremos el valor 1 de la sublista [1,2] >>>a[3][0] 1
También podemos utilizar este operador para modificar un elemento de la lista si lo colocamos en la parte izquierda de una asignación: >>> a = [22, True, “una lista”, [1, 2]] >>>a[0] 22 >>>a[0] =99 >>>a[0] 99 Una curiosidad sobre el operador [] de Python es que podemos utilizar también números negativos. Si se utiliza un número negativo como índice, esto se traduce en que el índice empieza a contar desde el final, hacia la izquierda; es decir, con [-1] accederíamos al último elemento de la lista, con [-2] al penúltimo, con [-3], al antepenúltimo, y así sucesivamente. >>>a = [22, True, “una lista”, [1, 2]] >>>a[-1] [1,2]
Sentencias condicionales Aquí es donde cobran su importancia el tipo booleano y los operadores lógicos y relacionales que aprendimos en el capítulo sobre los tipos básicos de Python. if La forma más simple de un estamento condicional es un if (del inglés si) seguido de la condición a evaluar, dos puntos (:) y en la siguiente línea e indentado, el código a ejecutar en caso de que se cumpla dicha condición. >>> valor=”programa” >>> if valor == “programa” : print “Respuesta correcta” if … else >>> valor=”programa” >>> if valor == “programa” : print “Respuesta correcta” …else: print “respuesta incorrecta” Respuesta correcta if … elif … elif … else Elif es una contracción de else if, por lo tanto elif numero > 0 puede leerse como “si no, si número es mayor que 0”. Es decir, primero se evalúa la condición del if. Si es cierta, se ejecuta su código y se continúa ejecutando el código posterior al condicional; si no se cumple, se evalúa la condición del elif. Si se cumple la condición del elif se ejecuta su código y se continua ejecutando el código posterior al condicional; si no se cumple y hay más de un elif se continúa con el siguiente en orden de aparición. Si no se cumple la condición del if ni de ninguno de los elif, se ejecuta el código del else. >>>numero=1 >>>if numero >0: print “número positivo” …elif numero <0: print “número negativo” …else: print “Cero” número positivo Practica 4 Entrada estándar La forma más sencilla de obtener información por parte del usuario es mediante la función raw_input. Esta función toma como parámetro una cadena a usar como prompt (es decir, como texto a mostrar al usuario pidiendo la entrada) y devuelve
una cadena con los caracteres introducidos por el usuario hasta que pulsó la tecla Enter. Veamos un pequeño ejemplo: >>>nombre = raw_input(“dame tu nombre: “) Definición de una Función >>> def imprimedoble(dato): …
print dato dato
Esta función toma un argumento y lo asigna a un parámetro llamado dato. El valor del parámetro (en este momento no tenemos idea de lo que será) se imprime dos veces. >>>imprimedoble(“azul”) azul azul >>>imprimedoble(“azul”*3) azulazulazul azulazulazul >>> def concatenarDoble(parte1, parte2): …
cat = parte1 + parte2
…
imprimaDoble(cat)
>>>concatenarDoble(“uno”,”dos”) unodos unodos
def conteo(n): if n == 0: print "Despegue!" else: print n conteo(n-1)
RESOLICION DE EJERCICIOS EN SHARPDEVELOP. Crear y ejecutar en el editor SharpDevelop la siguiente función de Ironpython def conteo(n): if n == 0: print "Despegue!" else: print n conteo(n-1) a=raw_input("presiona enter") conteo(10) Crear y ejecutar en el editor SharpDevelop la siguiente lista de datos, y con la función len() contar el número de letras de cada palabra en la lista de datos. Utilice la instrucción for para revisar cada palabra de la lista. palabras= ["windows","universidad","ingenieria de software","interpretes"] for i in palabras: print (i, len(i)) a=raw_input("presiona enter")
Crear y ejecutar en el editor SharpDevelop un programa que solicite la edad y nos indique cuantos días hemos vivido, además que se valide que se capturó un número y no una letra. try: edad =raw_input("Cual es tu edad: ") dias=int(edad)*365 print "Has vivido " + str(dias) + " dias" a=raw_input("presiona enter") except ValueError: print "Eso no es un numero, verifica!" a=raw_input("presiona enter")
Operaciones básicas. num1=raw_input("dame el primer numero") num2=raw_input("dame el segundo numero") suma=int(num1)+int(num2) print("el resultado de la suma es: ",suma) #a=raw_input("presione enter para continuar") resta=int(num1)-int(num2) print("el resultado de la resta es: ",resta) #a=raw_input("presione enter para continuar") multiplicacion=int(num1)*int(num2) print("el resultado de la multiplicacion es: ",multiplicacion) #a=raw_input("presione enter para continuar") elevar=int(num1)**int(num2) print("el resultado de la elevacion es: ",elevar) #a=raw_input("presione enter para continuar") if int(num2)!=0: division=int(num1)/int(num2) print("el resultado de la division es: ",float(division)) a=raw_input("presione enter para continuar")
Menu de operaciones. while True: print("1.suma") print("2.resta") print("3.division") print("4.multiplicacion") print("5.arreglo") print("6.elevar") print("7.Instr. for") print("8.Salir") o=raw_input("Seleccione la operación que desea hacer: " ) while o > '8' or o == '0' or o >= '10': print("¡Ha escrito un número incorrecto! Inténtelo de nuevo") o=raw_input("Seleccione la operación que desea hacer: " ) if o == '1': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") suma=int(num1)+int(num2) print("el resultado de la suma es: ",suma) elif o == '2': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") resta=int(num1)-int(num2) print("el resultado de la resta es: ",resta) elif o =='3': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") if int(num2)!=0: division=int(num1)/int(num2) print("el resultado de la division es: ",float(division)) else: print("No puede dividir entre 0")
elif o == '4': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") multiplicacion=int(num1)*int(num2) print("el resultado de la multiplicacion es: ",multiplicacion) elif o == '5': a= raw_input ("Dame tres palabras: ") b= raw_input (", " ) c= raw_input(", " ) palabras = [a, b, c] print (palabras) p= raw_input ("desea cambiar una palabra?. Escriba SI o NO: " ) if p == 'SI': k= raw_input("que palabra desea cambiar? " ) if k== a: a= raw_input("Dame la nueva palabra: " ) elif k== b: b= raw_input ("Dame la nueva palabra: " ) elif k== c: c=raw_input ("Dame la nueva palabra: " ) else: print ("La palabra no es correcta") else: print ("No se cambio ninguna palabra") palabras = [a, b, c] print (palabras) elif o == '6': num1=raw_input("dame el primer numero: ") num2=raw_input("dame el segundo numero: ") elevar=int(num1)**int(num2) print("el resultado de la elevacion es: ",elevar) elif o == '7': def conteo(n): if n == 0: print "Despegue!" else: print n conteo(n-1) a=raw_input("presiona enter") conteo(10) elif o == '8': 単= raw_input("presione enter para salir") break
Tablas de multiplicar. numero = raw_input("que tabla quieres?: ") print "tabla del",int(numero) for v in range(1,11): print numero,"x",v,"=",int(numero) * variable a=raw_input("precione enter para salir")
Tablas de multiplicar (da la tabla del 1 hasta la tabla que pidas). while True: numero = raw_input("que tabla quieres?: ") print "tabla del",int(numero) for v in range(1,int(numero) + 1): for j in range(1,11): print v,"x",j,"=",v * j a=raw_input("Desea otra operacion (S/N): ") if a == 'N': break
CONCLUCION. En la materia de intérpretes aunque es mucha teoría el profesor nos explicaba un poco más para tener nuestro conocimiento más alerta y saber un poco más, lo aprendido en la materia es tener claro que es un intérprete en que consiste uno como se analizan para que sirve, como se maneja un interpretador.